我刚刚在修改脚本,以使进程后台和并行化。
我进行了一些试验(在Solaris上同时使用bash和ksh),发现'wait'如果不为0则输出退出状态,或者当没有提供PID参数时返回非零退出的作业列表。例如
重击:
$ sleep 20 && exit 1 &
$ sleep 10 && exit 2 &
$ wait
[1]- Exit 2 sleep 20 && exit 2
[2]+ Exit 1 sleep 10 && exit 1
Ksh:
$ sleep 20 && exit 1 &
$ sleep 10 && exit 2 &
$ wait
[1]+ Done(2) sleep 20 && exit 2
[2]+ Done(1) sleep 10 && exit 1
此输出被写入stderr,因此对OP示例的简单解决方案可以是:
#!/bin/bash
trap "rm -f /tmp/x.$$" EXIT
for i in `seq 0 9`; do
doCalculations $i &
done
wait 2> /tmp/x.$$
if [ `wc -l /tmp/x.$$` -gt 0 ] ; then
exit 1
fi
虽然这样:
wait 2> >(wc -l)
也会返回一个计数,但没有tmp文件。也可以通过这种方式使用它,例如:
wait 2> >(if [ `wc -l` -gt 0 ] ; then echo "ERROR"; fi)
但这并没有比tmp文件IMO有用得多。我找不到避免tmp文件的有用方法,同时也避免在子外壳程序中运行“等待”,这根本行不通。
wait -n
,现代bash中可用,仅在first / next命令完成时返回。