如何从源bash脚本返回错误

时间:2016-09-29 14:51:07

标签: bash return-value

我对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未执行,因为此脚本也可以独立于这些父脚本执行
  3. 这个thread谈到了使用return语句从源bash脚本返回,但是当执行script4时我需要退出。我不明白为什么script4中的exit语句会导致原始shell和子shell终止?当然它应该只退出子shell?

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

    感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果需要,您可以启用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>,但事实并非如此。

答案 1 :(得分:1)

最佳做法是明确。如果您的代码总是来源,因此repeat { statements } while condition 将有效,只需::

return

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

如果您不知道自己是否会被采购或执行,这会变得更加复杂:

return
相关问题