使用||进行Bash控制流程在函数上,使用set -e

时间:2017-08-09 21:33:27

标签: bash function shell error-handling

如果我将set -e放入Bash脚本中,脚本将在未来的错误中退出。我对如何使用函数感到困惑。请考虑以下内容,它只会将one打印到标准输出:

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun

显然,non_existing_command是一个错误,因此脚本会在第二个echo之前退出。当且仅当第一个命令失败时,通常可以使用运算符||来运行另一个命令。也就是说,我怀疑以下内容打印出onethree,但现在two

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun || echo three

但我得到的是onetwo。也就是说,||运算符阻止退出(应该如此),但它选择继续使用函数体并忽略右手命令。

有任何解释吗?

1 个答案:

答案 0 :(得分:4)

似乎记录在the set builtin command

  

如果复合命令或shell函数在忽略-e的上下文中执行[例如在||的左侧],则在即使设置了-e并且命令返回失败状态,复合命令或函数体也会受-e设置的影响。

重点和评论是我的。

另外,如果您尝试在函数中set -e,请不要打扰:下一句话:

  

如果复合命令或shell函数在忽略-e的上下文中执行时设置-e,则在复合命令或包含函数调用的命令完成之前,该设置将不起作用。