4

我找不到任何表明这是正确行为的文档。我已经在 bash 4.2.25 和 4.1.2 上验证了这种行为。这些是我可以轻松访问的最新版本。如果有人能解释为什么条件会改变前一个子shell的行为,我们将不胜感激。

# ( set -e; false ; echo bye )
# ( set -e; false ; echo bye ) || echo "failed"
bye
#

谢谢,布赖恩

4

2 回答 2

2

我相信4.2 手册页中-e选项描述的强调部分适用:bash

如果失败的命令是在 && 或 || 中执行的任何命令的[...]部分,则 shell 不会退出 列表 [...]

false命令是构成||操作符 LHS 的子 shell 的一部分,因此尽管它失败了,但-e仍会忽略 。可以说,这是一个错误,因为false它不是实际设置||的 shell的一部分。set -e

于 2014-05-28T21:36:22.887 回答
2

请参阅以下链接

在执行 while、until、if 或 elif 保留字(以 ! 开头的管道)之后的复合列表时,应忽略 -e 设置 保留字,或除最后一个以外的 AND-OR 列表的任何命令。

于 2014-05-28T21:40:18.710 回答