回答:
#!/bin/bash
command1 &
command2 &
command3 &
wait
command4
wait
(引数なし)は、すべてのバックグラウンドプロセスが終了するまで待機します。
マニュアルwait
内の完全なbash
説明:
wait [-n] [n ...]
指定された各子プロセスを待機し、その終了ステータスを返します。それぞれ
n
は、プロセスIDまたはジョブ仕様です。ジョブ仕様が指定されている場合、そのジョブのパイプライン内のすべてのプロセスが待機されます。 が指定されていない場合n
、現在アクティブなすべての子プロセスが待機され、戻りステータスはゼロになります。-n
オプションが指定されている 場合、wait
ジョブが終了するまで待機し、終了ステータスを返します。n
存在しないプロセスまたはジョブを指定する場合、戻りステータスは127です。それ以外の場合、戻りステータスは最後に待機したプロセスまたはジョブの終了ステータスです。
cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"
または似たようなもの。
私はwait
答えが好きですが、学術的な演習として、これもうまくいくと思います:
bash -c 'command1 & command2 & command3 &' && command4
私が間違っている場合は修正してください。
time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo
bashコマンドに5秒かかったと言わない場合、望みどおりの動作をしませんでした。
PID1=$!
でそれらすべてを待つことですwait "$PID1" "$PID2" "$PID3"
。これは少し複雑ですが、プロセスに待機したくない他の子がある場合は機能します。