在bash if-condition上使用wait process-id返回错误代码1以成功终止进程

时间:2016-04-27 13:49:15

标签: bash shell wait

我在成功/失败条件下知道了一些bash返回码,但我在wait条件下对几个脚本的后台进程进行了if试验,我当时很惊讶地看到返回错误代码0表示成功的行为,而失败案例则表示非零。

我的脚本: -

$cat foo.sh
#!/bin/bash
sleep 5

$cat bar.sh
#!/bin/bash
sleep 10

$cat experiment.sh 
./foo.sh &
pid1=$!

./bar.sh &
pid2=$!

if  wait $pid1 && wait $pid2
then
    echo "Am getting screwed here!"
else
    echo "Am supposed to be screwed here!"
fi

按原样运行脚本并将输出设为Am getting screwed here!而不是Am supposed to be screwed here!

$./experiment.sh
Am getting screwed here!

现在修改脚本以在exitfoo.sh

中使用bar.sh强制返回退出代码
$cat foo.sh
#!/bin/bash
sleep 5
exit 2

$cat bar.sh
#!/bin/bash
sleep 10
exit 17

我很惊讶地看到输出为

$./experiment.sh
Am supposed to be screwed here!

为详细帖子道歉,但任何帮助表示赞赏。 手册页供参考: - http://ss64.com/bash/wait.html

1 个答案:

答案 0 :(得分:2)

这是正确的行为。 wait的退出状态(使用单个进程ID调用时)是正在等待的进程的退出状态。由于它们中至少有一个具有非零退出状态,因此&&列表失败并且else分支被占用。

理由是命令有一种方法(0)可以成功,但有很多种方式(任何非零整数)失败。不要将bash对退出状态的使用与0的标准布尔解释混淆为false,将非零归为真。 shell if语句检查其命令是否成功。