Bash';如果子级退出非零,则s wait命令不返回0
bash的Bash';如果子级退出非零,则s wait命令不返回0,bash,Bash,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
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
)。问题是,父进程继续进行,就好像没有什么不好的事情悄悄发生一样。也就是说,我想传播错误
有没有办法启用此行为?也就是说,如果有孩子退出非零状态,让wait返回非零状态。根据,这就是应该发生的情况(我的重点):
child 1 & # succeeds
child 2 & # fails
child 3 & # succeeds
for i in 1 2 3; do
wait -n
done
如果未给定n,则等待所有当前活动的子进程
对于和,返回状态为零
第二种形式是指定
wait{pid1}{pid2}{…}
并返回正确的错误代码。如果使用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
Hm对于带有pid的表单,my bash manpage声明(emphasis mine)“否则,返回状态是等待的最后一个进程或作业的退出状态。”因此仍然不能保证获得任何非零状态,或者我认为它是错误的?-除非你一个接一个地等他们-one@StefanHegny没错,
wait pid1 pid2
只返回pid2的状态,您需要wait-n
(在bash
4.3或更高版本中)来获取单个任意子级的退出状态。(不过,您不知道哪个孩子退出了。)