我在成功/失败条件下知道了一些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!
现在修改脚本以在exit
和foo.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
答案 0 :(得分:2)
这是正确的行为。 wait
的退出状态(使用单个进程ID调用时)是正在等待的进程的退出状态。由于它们中至少有一个具有非零退出状态,因此&&
列表失败并且else
分支被占用。
理由是命令有一种方法(0)可以成功,但有很多种方式(任何非零整数)失败。不要将bash
对退出状态的使用与0的标准布尔解释混淆为false,将非零归为真。 shell if
语句检查其命令是否成功。