我对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 $?
我的要求是:
这个thread谈到了使用return语句从源bash脚本返回,但是当执行script4时我需要退出。我不明白为什么script4中的exit语句会导致原始shell和子shell终止?当然它应该只退出子shell?
我需要查看信号和陷阱吗?
感谢您的帮助
答案 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