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

cru*_*ore 5 linux bash shell short-circuiting

当我运行一个bash脚本时,我看到一些对我没有意义的行为,该-e选项有多个命令与&&s 串在一起,其中一个失败.我希望脚本停止在失败的命令上并返回退出状态,但它只是愉快地执行脚本的其余部分.

以下是对我有意义的例子:

$ false && true; echo $?
1

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

$ bash -xe -c "false; true"; echo $?
+ false
1
Run Code Online (Sandbox Code Playgroud)

这是对我没有意义的那个:

$ bash -xe -c "false && true; true"; echo $?
+ false
+ true
0
Run Code Online (Sandbox Code Playgroud)

这是我不明白发生了什么的地方.false && true返回状态1所以脚本不应该停止执行并返回状态1,就像脚本一样false; true

在进行实验的过程中,我发现如果用括号括起命令链,它会按照我的预期方式工作:

$ bash -xe -c "(false && true); true"; echo $?
+ false
1
Run Code Online (Sandbox Code Playgroud)

有人能解释一下吗?

Wil*_*mer 7

这里的逻辑是你使用&&已经错误检查.同样地,bash并不if会将条件中的失败视为值得中止,即使是set -e.

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


n. *_* m. 6

引用参考手册:

如果失败的命令是紧跟在 while 或 until 关键字之后的命令列表的一部分、if 语句中测试的一部分、在 && 或 || 中执行的任何命令的一部分,则 shell 不会退出 列表除了最后一个 && 或 || 之后的命令,管道中除最后一个之外的任何命令,或者如果命令的返回状态正在用 !