【发布时间】:2010-09-26 05:55:18
【问题描述】:
如何在 bash 脚本中等待从该脚本生成的几个子进程完成,然后当任何子进程以代码 !=0 结束时返回退出代码 !=0?
简单脚本:
#!/bin/bash
for i in `seq 0 9`; do
doCalculations $i &
done
wait
上述脚本将等待所有 10 个生成的子进程,但它总是会给出退出状态0(请参阅help wait)。如何修改此脚本,以便在任何子进程以代码 !=0 结尾时发现生成的子进程的退出状态并返回退出代码 1?
有没有比收集子进程的PID,按顺序等待它们并总结退出状态更好的解决方案?
【问题讨论】:
-
这可以显着改进以触及
wait -n,在现代 bash 中可用,仅在第一个/下一个命令完成时返回。 -
如果你想使用 Bash 进行测试,试试这个:github.com/sstephenson/bats
-
积极开发BATS已移至github.com/bats-core/bats-core
-
@CharlesDuffy
wait -n有一个小问题:如果没有剩余的子作业(也称为竞争条件),它会返回一个非零退出状态(失败),这与失败的子作业无法区分过程。 -
@drevicko:在这里等待 -n 解决方案:stackoverflow.com/a/59723887/627042