Bashはスクリプトのすべてのサブプロセスを待ちます。

Bashはスクリプトのすべてのサブプロセスを待ちます。

スクリプトがあります

for i in 1 2 3 4; do
    do_something $i &
done

呼び出すと、do_something他のすべての項目が終了する前に終了します。私が見つけたこの問題さまざまな答えがあります。

編集するhelp wait教えてください

IDが指定されていない場合は、現在アクティブなすべての子プロセスが待機し、ステータス0が返されます。

wait最後に1つだけ追加すれば十分ですか?

答え1

はい、waitすべてのバックグラウンドジョブが終了するのを待つには、最後にパラメータなしで単一のコマンドを使用するだけで十分です。

サブシェルで開始されたバックグラウンドジョブは、そのジョブを開始したのと同じサブシェルで待機する必要があります。表示されるコードにはそのようなインスタンスはありません。

また参考にしてくださいあなたがリンクした質問に関する質問終了ステータスの確認バックグラウンドタスク。これ会議各バックグラウンドジョブに対して1回実行する必要がありますwait(ジョブのPIDを引数として使用)。

答え2

私の考えでは、パラメータなしで一度だけ待つだけで十分ですが、これは良い習慣ではありません(デフォルトの動作に依存)。各呼び出しから返されたPIDを収集し、そのPIDを明示的に待ちます。

関連情報