2番目のコマンドが終了したらすぐに最初のコマンドを終了します

2番目のコマンドが終了したらすぐに最初のコマンドを終了します

私は長い間、このシナリオのベストプラクティスを探していました。

事前に実行されているプロセス 1 に依存するプロセス 2 がある場合、次のようなエイリアスを設定します。

alias both='process1 & process2'

次に、プロセス2 が終了したら、プロセス1 も終了するようにします (現在の解決策は、ターミナルに戻ってkill %%)。

たとえば(Mac から USB 経由で iOS デバイスに接続する場合):

alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost'

iproxy実行を継続し、終了したらすぐに終了するにはどうすればよいでしょうかssh?

答え1

kill $!末尾に追加するだけです:process1 & process2; kill $!

$!変数(Bashでは紛らわしいことに「パラメータ」と呼ばれます)であり、拡大する最後のバックグラウンド PID まで:

非同期コマンドとして実行されたか、bg 組み込みコマンドを使用して実行されたかに関係なく、最後にバックグラウンドに配置されたジョブのプロセス ID に展開されます (以下のジョブ制御を参照)。

%%fgは特殊であり、やなどのシェル組み込みコマンドのコンテキストでのみ最後のバックグラウンド PID に展開されますkill。残念ながら、これはページからは明らかではありませんman

記号 %% および %+ は、シェルの現在のジョブの概念を表します。現在のジョブは、フォアグラウンドで停止された最後のジョブ、またはバックグラウンドで開始された最後のジョブです。


PS: これをコマンド文字列にする必要がある場合は、kill $!実行時に展開されるようにシングルクォートで囲むようにしてください。さらに良いのは、エイリアスの代わりに関数を記述して、制限

関連情報