"wait" は for ループで開始されたプロセスには使用されますが、以前に開始された他のプロセスには使用されません。

"wait" は for ループで開始されたプロセスには使用されますが、以前に開始された他のプロセスには使用されません。

複数のバックグラウンドジョブが実行されていますが、もう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を渡してください。。しかし、ループ内でプロセスを開始するので、forPIDを簡単に取得することはできません。

私はこれを試しましたが、運がありませんでした。

{ 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の指示に基づいてこの例を思いつきました。おそらく最も簡単ではないでしょう...

以下のコードはすべてインタラクティブシェルにあります。他の方法では読みにくいので、答えを得るために部分的に分割しました。

bash4.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;

関連情報