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
有谁知道这是有记录的行为,还是可以解释的?
对我来说完全是无稽之谈 (: