最後のバックグラウンドジョブが bash でハングするのはなぜですか?

最後のバックグラウンドジョブが bash でハングするのはなぜですか?

以下は bash 用に書かれたスクリプトです:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
#   jobs
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

10 秒間は動作しますが、期待どおり 3 秒間は動作しません。ただし、「jobs」コマンドのコメントを解除すると正常に動作します。理由がわかりません。助けてもらえますか?

「jobs」を含むスクリプト出力には次のようにコメントされています:

Waiting(10)...
JCNT=3
Waiting(9)...
JCNT=2
Waiting(8)...
JCNT=1
Waiting(7)...
JCNT=1
Waiting(6)...
JCNT=1
Waiting(5)...
JCNT=1
Waiting(4)...
JCNT=1
Waiting(3)...
JCNT=1
Waiting(2)...
JCNT=1
Waiting(1)...
JCNT=1
Waiting(0)...
JCNT=1

コメントされていない「jobs」コマンドの場合:

[1]   Running                 sleep 1 &
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(10)...
JCNT=3
[1]   Done                    sleep 1
[2]-  Running                 sleep 2 &
[3]+  Running                 sleep 3 &
Waiting(9)...
JCNT=2
[2]-  Done                    sleep 2
[3]+  Running                 sleep 3 &
Waiting(8)...
JCNT=1
[3]+  Done                    sleep 3
Waiting(7)...
JCNT=0

追加した

私はスクリプトを次のように変更しました:

#!/bin/bash
sleep 1 &
sleep 2 &
sleep 3 &
for t in {10..0}
do
    KKK=`jobs`
    echo $KKK
    echo "Waiting("$t")..."
    JCNT=`jobs | wc -l`
    echo "JCNT="$JCNT
    if [ $JCNT -eq 0 ]; then
        break
    fi
    sleep 1
done
exit 0

...そして、最後に実行されたジョブに関する情報があることがわかりました。

[3] Done sleep 3

「jobs」を呼び出すと、完了したジョブのリストが消去されるだけです。「jobs|wc -l」を実行するのは、アクティブなジョブをカウントする間違った方法です。正しい方法は「jobs -r|wc -l」です。

答え1

質問への回答ではありませんが、ヒントとして:

ループ内でジョブを個別に実行すると、期待どおりに動作/カウントされます。

しかし、今のところ接着剤はありません。

関連情報