使用||的Bash控制流程 在功能上,使用-e

jmd*_*_dk 5 error-handling bash shell function

如果我set -e输入了Bash脚本,该脚本将在以后出现错误时退出。我对此功能如何工作感到困惑。请考虑以下内容,这些内容仅会one按标准输出:

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun
Run Code Online (Sandbox Code Playgroud)

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

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun || echo three
Run Code Online (Sandbox Code Playgroud)

但是我得到的是onetwo。也就是说,||操作员阻止退出(如应有的那样),但它选择继续使用功能主体,而忽略右手命令。

有什么解释吗?

gle*_*man 6

它出现在被记录set内置命令

如果其中在上下文中的化合物命令或壳功能执行-e被忽略[如上的左侧||],没有一个化合物命令或函数体内执行的命令将受影响的-e设置,即使-e是组命令返回失败状态。

强调和评论是我的。

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

如果-e-e忽略的上下文中执行时设置了复合命令或shell函数,则该设置将不会生效,直到复合命令或包含函数调用的命令完成。