从命令替换中退出脚本时出错

从命令替换中退出脚本时出错

如果我有一个函数:

myfunction() {
  [ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
  global_var=somevalue
}

我从另一个函数中调用它:

some_other_function() {
  myfunction
  # Do something with "$global_var"
}

这按预期工作:如果条件myfunction失败,错误退出将终止整个脚本以防止执行其他代码。

在重构与其他脚本(在源文件中)共享函数定义的非常大的脚本时,我想通过返回一些全局变量来删除它们,如下所示:

myfunction() {
  [ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
  local somevar=somevalue
  # do stuff with "$somevar", then...
  # return value of somevar to calling function.
  printf %s "$somevar"
}

some_other_function() {
  local anothervar="$(myfunction)"
  # Do something with "$another_var"
}

但是,此处的错误退出未能按预期工作。它不会杀死脚本,而只会杀死该函数,该函数由于命令替换而在子 shell 中执行。

有没有办法模块化这个大型脚本以允许从函数返回文本值(而不是使用全局变量)并且仍然允许函数从整个脚本中错误退出?

答案1

您必须向主 shell 发送信号:

# start of the main script:
MAIN_SHELL_PID=$$

[...]

myfunction() {
    ... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}

答案2

一个更简单的解决方案是将本地声明和赋值写在两个单独的语句中:这会导致函数的退出状态作为赋值的退出状态保留下来,从而有助于在函数发生错误时杀死 while 脚本:

some_other_function() {
  local anothervar
  anothervar="$(myfunction)"
  # Do something with "$another_var"
}

更详细的解释

相关内容