如果我将set -e
放入Bash脚本中,脚本将在未来的错误中退出。我对如何使用函数感到困惑。请考虑以下内容,它只会将one
打印到标准输出:
set -e # Exit on error
fun(){
echo one
non_existing_command
echo two
}
fun
显然,non_existing_command
是一个错误,因此脚本会在第二个echo
之前退出。当且仅当第一个命令失败时,通常可以使用或运算符||
来运行另一个命令。也就是说,我怀疑以下内容打印出one
和three
,但现在two
:
set -e # Exit on error
fun(){
echo one
non_existing_command
echo two
}
fun || echo three
但我得到的是one
和two
。也就是说,||
运算符阻止退出(应该如此),但它选择继续使用函数体并忽略右手命令。
有任何解释吗?
答案 0 :(得分:4)
如果复合命令或shell函数在忽略
-e
的上下文中执行[例如在||
的左侧],则在即使设置了-e
并且命令返回失败状态,复合命令或函数体也会受-e
设置的影响。
重点和评论是我的。
另外,如果您尝试在函数中set -e
,请不要打扰:下一句话:
如果复合命令或shell函数在忽略
-e
的上下文中执行时设置-e
,则在复合命令或包含函数调用的命令完成之前,该设置将不起作用。