如果子项退出非零,则Bash的wait命令不返回0

时间:2016-06-29 20:32:26

标签: 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
        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)。问题是父进程掠夺,好像没有任何不好的事情发生。即我想传播错误。

有没有办法启用此行为?即如果任何子项退出非零,则等待返回非零。

2 个答案:

答案 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