如何 return 来自来源 bash 脚本的错误

How to return the error from a sourced bash script

我对 bash 脚本编写还很陌生。我有 4 个嵌套的 bash 脚本,我无法适当地从第 4 个脚本传播错误。例如:

script1.sh:
  source script2.sh
  <check for error and display appropriate message>
script2.sh:
  source script3.sh param_1
  <return to script1 on error>
  source script3.sh param_2
  <return to script1 on error>
  source script3.sh param_n
  <return to script1 on error>
script3.sh
  <some processing>
  script4.sh
  echo "this statement is not reached"
  return $?
script4.sh
  <some processing>
  exit $?

我的要求是:

  1. 我需要在 script1 中定义一个关联数组,它在 script2 中填充并在 script3 的范围内可用。我认为做到这一点的唯一方法是 source script2 和 script3
  2. script4 的执行不是源代码,因为这个脚本也可以独立于这些父脚本执行

这个 thread 谈到使用 return 语句从来源 bash 脚本到 return,但是当 script4 被执行时我需要退出。我不明白为什么 script4 中的 exit 语句会导致原始 shell 和子 shell 都终止?当然它应该只退出 sub shell?

我需要查看信号和陷阱吗?

感谢您的帮助

如果需要,您可以保持 set -e 处于启用状态。然后你必须更加小心地调用你知道退出状态可能为非零的脚本:

script3.sh
  <some processing>
  if script4.sh; then
    rc=0
  else
    rc=$?
  fi
  echo "script4 complete"
  return $rc

https://www.gnu.org/software/bash/manual/bashref.html#index-set

IMO,如果您真的想因任何错误而中止程序,使用 set -e 是合适的。在这里,您想<check for error and display appropriate message>,显然不是这样。

最佳做法是明确。如果您的代码总是会被获取,因此 return 将是有效的,只需 ::

source foo || return

return 使用前一个命令的退出状态作为其默认值,因此无需捕获然后传递它。


如果您不知道自己是否会被找到或执行,这会变得有点复杂:

source foo || { rc=$?; return "$rc" 2>/dev/null || exit "$rc" }