2013-02-12 41 views
5

当我运行带有-e选项的bash脚本时,出现了一些对我来说没有意义的行为,该选项有多个与&&一起串联的命令,其中一个命令失败。我希望脚本停止失败的命令并返回退出状态,但是它只是快乐地执行脚本的其余部分。为什么bash在短路命令的顺序中不能停止错误?

下面举例说明了意义,我:

$ false && true; echo $? 
1 

$ bash -xe -c "false && true"; echo $? 
+ false 
1 

$ bash -xe -c "false; true"; echo $? 
+ false 
1 

这里是一个没有意义对我说:

$ bash -xe -c "false && true; true"; echo $? 
+ false 
+ true 
0 

这是我不明白是什么继续。 false && true返回状态1,所以脚本不应该停止执行并返回状态1,就像脚本为false; true时那样?

虽然实验,我发现它的作品我会想到办法,如果我周围的命令用括号链:

$ bash -xe -c "(false && true); true"; echo $? 
+ false 
1 

任何人都可以给这个解释?

回答

7

这里的逻辑是你使用&&已经错误检查。 bash不会将if条件中的故障视为值得中止,即使使用set -e也是如此。

将命令包装在括号中时,实际上是在子shell中运行这些命令,因此脚本本身只会看到该子shell的返回,即:它根本不知道&&是否涉及到,所以它会像你期望的那样夭折。

+0

这实际上很有意义。我知道'if'是这样工作的,但是我从未想到bash会以同样的方式处理&&。 – histumness 2013-02-12 20:18:22

4

答曰参考手册:

壳不会退出如果失败的命令是紧跟在同时或直到关键字,测试的一部分的if语句,部分命令列表的一部分任何在& &或||中执行的命令list,除了最后的命令& &或||之外的任何命令,但是最后一个命令或者命令的返回状态与!

相关问题