[当我运行带有-e
选项的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
有人可以对此进行解释吗?
这里的逻辑是您对&&
的使用已经是错误检查。即使使用if
,bash也不会将set -e
条件内的失败视为值得中止。
[将命令包装在括号中时,实际上是在子shell中运行这些命令,因此脚本本身仅看到该子shell的返回,即:根本不知道&&
涉及,所以它会按预期中止。
查阅参考手册:
为了避免在evaluating false