bash的wait
似乎没有像我期望的那样尊重set -e
。或者它以某种方式丢失跟踪出现错误的子进程。考虑一下这个例子。
set -e # exit immediately on error
function child()
{
if [ $1 -eq 3 ]; then
echo "child $1 performing error"
# exit 1 ## I also tried this
false
else
echo "child $1 performing successful"
true
fi
echo "child $1 exiting normally"
}
# parent
child 1 & # succeeds
child 2 & # fails
child 3 & # succeeds
wait # why doesn't wait indicate an error?
echo "Launch nukes!" # don't want this to execute if a child failed
我想要set -e
语义,但wait
似乎并不尊重它们。
父母发起三个孩子。其中一个窒息而退出并出现错误(尊重set -e
)。问题是父进程掠夺,好像没有任何不好的事情发生。即我想传播错误。
有没有办法启用此行为?即如果任何子项退出非零,则等待返回非零。
答案 0 :(得分:2)
根据OneHotEncoder
,应该发生的事情(强调我的):
如果未给出n,则等待所有当前活动的子进程 for和返回状态为零。
您需要指定wait {pid1} {pid2} {...}
的第二个表单并返回正确的错误代码。
答案 1 :(得分:2)
如果您使用的是bash
4.3,则可以在循环中使用wait -n
依次等待每个孩子。您不会知道哪个子项失败,但每当失败时,wait
的退出状态将为非零。
child 1 & # succeeds
child 2 & # fails
child 3 & # succeeds
for i in 1 2 3; do
wait -n
done