特定のコマンドを実行した後、コマンド/スクリプトをどのように実行しますか?

特定のコマンドを実行した後、コマンド/スクリプトをどのように実行しますか?

flatpakパッケージを実行するためのエイリアスを生成する小さなスクリプトがあります(フラットパックをコマンドラインで何とか使用できるようにするため)。このコマンドを手動で実行すると、すべてがうまく機能します。

しかし、flatpakをインストール/更新/削除するたびにこのコマンドを手動で実行したくはありませんが、flatpakコマンドが呼び出されるたびにスクリプトを自動的に実行したいと思います。

だから、より効率的に表現するためにflatpak *命令をflatpak * && ~/my_script.sh

ボーナス:スクリプトが呼び出されたときにのみスクリプトが呼び出され、スクリプトが呼び出されたときに呼び出されないflatpak installようにflatpak removeこの関数を制限するにはどうすればよいですか?flatpak list

誰でもこれを達成する方法を知っていますか?

答え1

1つを作成してalias次の項目に追加できます.bashrc

alias flatpak='flatpak_(){ flatpak "$@" && ~/my_script.sh; }; flatpak_'

my_script最初の引数が次の場合にのみinstall実行されますremove

alias flatpak='flatpak_(){ flatpak "$@" && [[ "$1" = install || "$1" = remove ]] && ~/my_script.sh; }; flatpak_'

答え2

以下でラッパー関数を定義します.zshrc

flatpak () {
  command flatpak "$@" && ~/my_script.sh
}

組み込み関数は、関数を再帰的に呼び出すのではなく、(にある)command名前の外部コマンドを呼び出すようにシェルに指示します。に渡された引数のリストに置き換えられます。flatpak$PATH"$@"flatpak

これはすべてのsh-likeシェル(dash、bash、ksh、zshなど)で機能します(機能にアクセスできるように準備した場合)。関数はスクリプトで定義されていません。スクリプトでラッパーを使用するには、スクリプトの上部近くに関数を定義するか、where $PATHtrueの前にある別のスクリプトにラッパーを配置する必要があります。はいflatpak、見てください単純なラッパースクリプトは100のbashプロセスを生成します。

特定のコマンドの後にのみスクリプトを実行し、以前のように成功した場合にのみスクリプトを実行します。

flatpak () {
  command flatpak "$@" &&
  case $1 in
    install|remove) ~/my_script.sh;;
  esac
}

関連情報