
いくつかのタスクを並列に実行するためにスクリプトからいくつかのタスクを開始したいと思います。アクティブなジョブの数を数えることで、ジョブが完了した時点がわかります。私が持っている問題は、一時的に書き込みと読み取りを処理せずにこれらの操作から値を返したいということです。
この例では、実行中のジョブの数を計算できますが、値はa
次のように更新されません456
。
function _n_jobs() {
echo $(jobs -r | wc -l | tr -d " ")
}
a=123
(
sleep 2s
a=456
) &
echo "Number of jobs: "$(_n_jobs)
while (( $(_n_jobs) > 0 )); do
sleep 0.1s
done
echo $a
私は、並列に実行されるジョブから値を取得するためにサブシェルの出力をファイル記述子に書き込むことができることを発見しました。ただし、このサブシェルはジョブとして登録されません。つまり、一連の並列ジョブをコンピューティングジョブのように計算できないため、いつ完了したのかわかりません。
この例では、サブシェルの出力をファイル記述子にリダイレクトしてサブシェルから値を取得できますが、ジョブ数はです0
。
function _n_jobs() {
echo $(jobs -r | wc -l | tr -d " ")
}
a=123
exec {fd}< <(
sleep 2s
echo 456
)
echo "Number of jobs: "$(_n_jobs)
read <&${fd} a
echo $a
このように私の仕事の価値を返す方法はありますか?
例では数値を返しますが、終了コードを読み取るだけでは不十分です。結果がランダムになりたいので、文字列も返すことができます。これがファイル記述子を使用する理由です。