複数のバックグラウンドジョブが実行されていますが、もう2つのバックグラウンドジョブを実行したいのですが、最後の2つだけを待ちたいとします。たとえば、
# long running commands
sleep 60 &
sleep 60 &
# now wait only for these two:
sleep 5 & sleep 5 & wait; echo waited only for the 5s sleeps.
上記のコマンドの結果は、echoコマンドが60秒間待機することです。
私もできることを知っています待つpidまたはjobidを渡してください。。しかし、ループ内でプロセスを開始するので、for
PIDを簡単に取得することはできません。
私はこれを試しましたが、運がありませんでした。
{ sleep 3 & sleep 5 & } wait; echo did not wait :
sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s
PS:この質問は無理です。この簡単な質問。
答え1
サブシェルを起動できます。
{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output )
サブシェルのコマンドは、そのwait
サブシェルでのみ有効です。
答え2
私はもっと簡単な質問について@Kusalanandaの指示に基づいてこの例を思いつきました。おそらく最も簡単ではないでしょう...
以下のコードはすべてインタラクティブシェルにあります。他の方法では読みにくいので、答えを得るために部分的に分割しました。
bash
4.1以前では、inは対話型!
シェル""
で履歴の置き換えをトリガーすることに注意してください(この問題はバージョン4.2で修正されました)。これが私がだまされた理由です。実際に引用したい場合は、末尾のスペースを使用して履歴の置き換えが適用されないようにする$!
ことができます。"$! "
unset to_wait;
date;
sleep 3 &
for i in 1 2 3; do
sleep 1 &
# Don't put the ! in "" or you'll get an `event`.
to_wait+=( $! );
done;
wait "${to_wait[@]}";
date;
echo waited 1s for inner processes;
# wait for the rest of the processes (just for illustration)
wait;
date;
echo waited 3s for outer process;