我找不到任何表明这是正确行为的文档。我已经在 bash 4.2.25 和 4.1.2 上验证了这种行为。这些是我可以轻松访问的最新版本。如果有人能解释为什么条件会改变前一个子shell的行为,我们将不胜感激。
# ( set -e; false ; echo bye )
# ( set -e; false ; echo bye ) || echo "failed"
bye
#
谢谢,布赖恩
我找不到任何表明这是正确行为的文档。我已经在 bash 4.2.25 和 4.1.2 上验证了这种行为。这些是我可以轻松访问的最新版本。如果有人能解释为什么条件会改变前一个子shell的行为,我们将不胜感激。
# ( set -e; false ; echo bye )
# ( set -e; false ; echo bye ) || echo "failed"
bye
#
谢谢,布赖恩
我相信4.2 手册页中-e
选项描述的强调部分适用:bash
如果失败的命令是在 && 或 || 中执行的任何命令的[...]部分,则 shell 不会退出 列表 [...]
该false
命令是构成||
操作符 LHS 的子 shell 的一部分,因此尽管它失败了,但-e
仍会忽略 。可以说,这是一个错误,因为false
它不是实际设置||
的 shell的一部分。set -e
请参阅以下链接
在执行 while、until、if 或 elif 保留字(以 ! 开头的管道)之后的复合列表时,应忽略 -e 设置 保留字,或除最后一个以外的 AND-OR 列表的任何命令。