在 bash 手册页中,它指出:
如果管道(可能由单个简单命令组成)、
括号中的子shell命令或作为括号括起来的命令列表的一部分执行的命令之一,则立即退出...
所以我假设一个函数应该被认为是一个用大括号括起来的命令列表。但是,如果对函数调用应用条件,则 errexit 不再保留在函数体内,它会在返回之前执行整个命令列表。即使您在函数内显式创建子shell 并为该子shell 启用了errexit,命令列表中的所有命令也会执行。这是一个演示该问题的简单示例:
function a() { b ; c ; d ; e ; }
function ap() { { b ; c ; d ; e ; } ; }
function as() { ( set -e ; b ; c ; d ; e ) ; }
function b() { false ; }
function c() { false ; }
function d() { false ; }
function e() { false ; }
( set -Eex ; a )
+ a
+ b
+ false
( set -Eex ; ap )
+ ap
+ b
+ false
( set -Eex ; as )
+ as
+ set -e
+ b
+ false
现在,如果我对他们每个人都应用一个条件......
( set -Eex ; a || false )
+ a
+ b
+ false
+ c
+ false
+ d
+ false
+ e
+ false
+ false
( set -Eex ; ap || false )
+ ap
+ b
+ false
+ c
+ false
+ d
+ false
+ e
+ false
+ false
( set -Eex ; as )
+ as
+ set -e
+ b
+ false
+ c
+ false
+ d
+ false
+ e
+ false
+ false