如何 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 $?
我的要求是:
- 我需要在 script1 中定义一个关联数组,它在 script2 中填充并在 script3 的范围内可用。我认为做到这一点的唯一方法是 source script2 和 script3
- 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" }
我对 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 $?
我的要求是:
- 我需要在 script1 中定义一个关联数组,它在 script2 中填充并在 script3 的范围内可用。我认为做到这一点的唯一方法是 source script2 和 script3
- 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" }