当后跟条件控制运算符时,set -e在子shell中被忽略

时间:2014-05-28 21:24:10

标签: bash conditional subshell

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

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

感谢, 布赖恩

2 个答案:

答案 0 :(得分:2)

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

  

如果,shell不会退出                         失败的命令是[...] part 执行的任何命令                         a&&或||列表[...]

false命令是构成||运算符的LHS的子shell的一部分,因此尽管它失败,但忽略-e。可以说,这是一个错误,因为false不是||实际设置set -e的{​​{1}}的一部分。

答案 1 :(得分:2)

请参阅以下link

  

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