如果我跑
$#/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>&-