为什么 bash errexit 在函数调用中的行为不符合预期?

2024-02-16

在 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(使用前将#替换为@)

为什么 bash errexit 在函数调用中的行为不符合预期? 的相关文章

随机推荐