私が走ったら
$#/bin/bash
for i in `seq 5`; do
exec 3> >(sed -e "s/^/$i: /"; echo "$i-")
echo foo >&3
echo bar >&3
exec 3>&-
done
その場合、結果は同期しません。次のようになります。
1: foo
1: bar
2: foo
2: bar
1-
3: foo
3: bar
2-
3-
4: foo
5: foo
4: bar
5: bar
4-
5-
>(...)
次のイテレーションに進む前に、プロセス置換が完了していることを確認するにはどうすればよいですか?
sleep 0.1
後で挿入exec 3>&-
することは役に立ちましたが、それはエレガントではなく、非効率的であり、常に機能することが保証されているわけではありません。
編集:例はばかげているように見えるかもしれませんが、それは説明のためだけのものでした。私がやっていることは、ループ内の入力のストリームを読み取り、ループ中に時々変化するプロセスに各行をフィードすることです。コードで簡単に説明:
# again, simplified for illustration
while IFS= read line; do
case $line in
@*)
exec 3>&-
filename=${line:1}
echo "starting $filename"
exec 3> >(sort >"$filename"; echo "finished $filename")
;;
*)
echo "$line" >&3
;;
esac
done
exec 3>&-