Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash';如果子级退出非零,则s wait命令不返回0_Bash - Fatal编程技术网

Bash';如果子级退出非零,则s wait命令不返回0

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

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
)。问题是,父进程继续进行,就好像没有什么不好的事情悄悄发生一样。也就是说,我想传播错误

有没有办法启用此行为?也就是说,如果有孩子退出非零状态,让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或更高版本中)来获取单个任意子级的退出状态。(不过,您不知道哪个孩子退出了。)