web-dev-qa-db-ja.com

2つのコマンドを並行して実行し、そのうちの1つが終了コード0で終了する場合、どうすれば終了できますか?

同時に実行する2つのコマンドがあります。そして、スクリプトのいずれかがコード0または1で終了した場合、スクリプトを終了させたいのですが、Linux(Ubuntu)でこれを実現するにはどうすればよいですか。

cmd1 &
cmd2 &
wait
5
Sam

このようなもの:

(cmd1; [ "$?" -lt 2 ] && kill "$$") &
(cmd2; [ "$?" -lt 2 ] && kill "$$") &
wait
6
ctrl-d

bash 4.4以降:

cmd1 & p1=$!
cmd2 & p2=$!

wait -n
[ "$?" -gt 1 ] || kill "$p1" "$p2"
wait

wait -nは、最初のバックグラウンドジョブが完了するのを待機し、その終了ステータスを$?

これは、最初のジョブが0または1で終了したときに他のジョブを強制終了することを想定しています。スクリプトを終了し、他のコマンドを親なしで実行したままにする場合は、killコマンドをexitに変更します。

1