2

我在这里发布了一个问题:为什么 bash errexit 在函数调用中的行为不符合预期

while答案是因为当子shell、块或命令列表是, until, ||, if, elifor&&语句的逻辑谓词的一部分时,bash 不会因错误而退出。

我的下一个问题是:即使调用者正在创建逻辑分叉,如何强制在子shell 或阻塞中强制执行 errexit 选项。例如,组成 a 的命令列表将在第一个失败的命令上停止:

function a() { b ; c ; d ; e ; }
( set -e ; a )

但是,当您从逻辑上对其进行门控时,它不会:

( set -e ; a || false )

无论返回码如何,调用都a将执行b,和。即使您像这样明确表示,bash 也会忽略 errexit 谓词:cde

function a() { ( set -e ; b ; c ; d ; e ) ; return $? ; }
( set -e ; a || false )
4

1 回答 1

0

bash 实现所请求的行为是没有意义的,因为它会使决策树变得无用——你不能让布尔操作返回 false 并处理这种情况,因为该返回值会立即导致退出。

因此,bash没有实现该行为。#bash 在 freenode 上的一般建议是避免使用 set -e,并自行处理错误。

于 2013-11-05T15:17:24.260 回答