在 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
你开始引用manual http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html但后来你删掉了解释这种行为的部分,这是在下一句话:
-e
如果管道(可能由单个简单命令、括在括号中的子 shell 命令或作为括在大括号中的命令列表的一部分执行的命令之一)返回非零状态,请立即退出。shell不退出如果失败的命令是紧随其后的命令列表的一部分while
or until
关键字,测试的一部分if
陈述,在 a 中执行的任何命令的一部分&&
or ||
列出除了最后一个命令之外的命令&&
or ||
,管道中除最后一个命令之外的任何命令,或者命令的返回状态与!
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)