我有一个以下脚本sandbox.sh,
#!/bin/bash
set -eu -o pipefail -E
function func1() {
echo "FUNC1"
exit 1
}
function func2() {
local ret
ret=$(func1)
echo $ret
echo "(func2)This line shouldn't be reached:'${?}'" >&2
}
var=$(func1) # The Line
echo "main:This line shouldn't be reached:'${var}':'${?}'" >&2
Run Code Online (Sandbox Code Playgroud)
(GNU bash,版本 4.4.20(1)-release (x86_64-pc-linux-gnu))
这会按预期停止执行,
$ bash -eu sandbox.sh
$
Run Code Online (Sandbox Code Playgroud)
但是,如果我将“The Line”修改为var=$(func2)call func1through func2,它将给出以下输出
$ bash sandbox.sh
(func2)This line shouldn't be reached:'0'
main:This line shouldn't be reached:'FUNC1':'0'
$
Run Code Online (Sandbox Code Playgroud)
对我来说,当命令替换放置在函数中时,它的行为似乎有所不同,但我不明白为什么 bash 是这样设计的。另外,很可能出现一个函数的输出被另一个函数使用的情况,这种差异令人困惑。
注意:如果我像下面这样重写 …