为什么bash不会因短路命令序列中的错误而在出错时停止?

问题描述 投票:5回答:3

[当我运行带有-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

有人可以对此进行解释吗?

linux bash shell short-circuiting
3个回答
7
投票

这里的逻辑是您对&&的使用已经错误检查。即使使用if,bash也不会将set -e条件内的失败视为值得中止。

[将命令包装在括号中时,实际上是在子shell中运行这些命令,因此脚本本身仅看到该子shell的返回,即:根本不知道&&涉及,所以它会按预期中止。


4
投票

查阅参考手册:


0
投票

为了避免在evaluating false

© www.soinside.com 2019 - 2024. All rights reserved.