当通过“$(...)”运行时,bash“set -e”重置内部函数?

jwd*_*jwd 4 bash shell

set -e当通过扩展调用这些函数时,Bash 中的选项似乎会在函数内部重置$(...)

这让我很惊讶,我不确定这是否是一个错误。我无法在(通常相当详尽的)Bash 联机帮助页中找到此行为的描述。

注意:这里还有一些其他类似的帖子:

但它们都没有涉及$(...),这在联机帮助页中也没有真正讨论。

我在优秀的Bash FAQ 105中也找不到对此问题的参考。

这是一个小程序来演示这个问题:

echo "Initial:    $-"
set -eu
echo "After set:  $-"

function foo() {
    echo "Inside foo: $-"
}
foo

function bar() {
    false    # I'd expect this to immediately fail
    echo "Inside bar: $-"
}
# When a $(...) construct is involved, 'bar' runs to completion!
x=$(bar)
echo "We should never get here ... but we do."
echo "$x"
Run Code Online (Sandbox Code Playgroud)

对我来说,在 Bash 版本上5.0.11(0)-release,我得到以下输出:

Initial:    hB
After set:  ehuB
Inside foo: ehuB
We should never get here ... but we do.
Inside bar: huB
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,-u在所有情况下该选项都会“传递”到该函数。-e当函数被正常调用时,该选项就会被传递。但只有在特殊情况下才会重置$(bar)该选项。-e

有谁知道这是有记录的行为,还是可以解释的?

对我来说完全是无稽之谈 (:

Jon*_*ler 5

set -e命令替换结合使用的行为记录在命令执行环境中:

\n\n
\n

-e为执行命令替换而生成的子 shell 继承了父 shell 的选项值。当不处于 POSIX 模式时,Bash 会清除-e此类子 shell 中的选项。

\n
\n\n

这似乎表明您看到的行为是预期的 \xe2\x80\x94 除非您在 POSIX 模式下运行,该-e选项在 Bash 的命令替换子 shell 中未设置(即使该-e设置最初是继承的,但很快就会更改)子 shell 开始执行后)。不过,这是一种有趣的写作方式。

\n