bash中的嵌套函数:为什么返回会停止父函数?

时间:2019-01-22 06:57:45

标签: bash

function test_ok {
  echo "function without error" || { echo "[Error] text"; return 1; }
  echo "this is executed"
}
function test_nok {
  echo "function with error"
  cause-an-error || { echo "[Error] text"; return 1; }
  echo "this is not executed"
  echo "this is not executed"
}
test_ok ; echo "$?"
test_nok ; echo "$?"

我希望函数return 1中的test_nok仅退出嵌套函数{ echo "[Error] text"; return 1; },并执行以下两个回显命令,因为它们属于父函数test_nok

但是事实并非如此,echo "this is not executed"实际上没有执行,test_nok的退出代码为1。这是我需要的行为,但是我不明白为什么这样工作=>为什么echo "this is not executed"未执行?

2 个答案:

答案 0 :(得分:1)

Gordon Davisson在一条评论中回答了我的问题:

这里没有嵌套函数。 { }不是函数,它只是对命令进行分组。

答案 1 :(得分:0)

您可以将错误代码保存在变量中,然后在函数末尾返回(尽管这可能不是一个好主意。我建议在错误发生时返回):

function test_nok {
    echo "function with error"
    cause-an-error || { error_code=$?; echo "[Error] text"; }
    echo "this is not executed"
    echo "this is not executed"
    return $error_code
}
test_nok
echo $?

输出:

function with error
./test.sh: line 5: cause-an-error: command not found
[Error] text
this is not executed
this is not executed
127