スクリプトで開始されたすべての子プロセスが終了したかどうかをどのように検出しますか?

スクリプトで開始されたすべての子プロセスが終了したかどうかをどのように検出しますか?

ループを使用して複数のコマンドを並列に実行したいと思いますfor。各コマンドには少し時間がかかることがあり、スクリプトの最後に別のコマンドを呼び出したいと思います。以下は最小限の例です。

#!/bin/bash

function test {
    length=$1
    sleep $length

    echo "$length"
    echo "-----"
}

# http://www.cyberciti.biz/faq/bash-for-loop-array/    
array=( 5 1 3 )

for time in "${array[@]}"
do
    test $time &
done

結果は次のとおりです。

$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----

ご覧のとおり、スクリプトOKが終了する前に表示されます。これはtestバックグラウンドで呼び出されるので論理的です。最後の呼び出しは他の呼び出しの前に終了する可能性があるため、テストを追加すること&はできません。バックグラウンド呼び出しのすべてのインスタンスが終了した後にのみtestスクリプトを終了したいと思います。test

これが私が得ようとしている結果です。

$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$ 

この出力をどのように取得できますか?

ベストアンサー1

あなたはする必要があります待つループを実行した後、for現在アクティブなすべての子プロセスを待ちます。

for time in "${array[@]}"
do
    test "$time" &
done

wait

おすすめ記事