假设我有两个 shell 脚本,a.sh
和b.sh
,其中在内部某处a.sh
调用b.sh
。然后,假设b.sh
可以使用退出代码0
、1
或退出2
。
可以采用哪些技术来确保 的退出代码a.sh
与 的退出代码可区分b.sh
?例如,如果我们决定a.sh
可以使用退出代码退出1
,那么这对调用者来说是不明确的——是a.sh
失败了,还是b.sh
失败了?这意味着a.sh
不应使用退出代码1
或2
.但可供选择的退出代码数量有限,并且b.sh
理论上可以随着其发展添加任意数量的附加退出代码。
是否有技术可以用来传递一些带有退出代码的额外数据,以确保我们作为脚本用户能够区分哪个程序居然失败了?或者作为脚本作者,我们是否应该假设我们的脚本将被视为黑匣子,并且我们的用户不应该深入了解我们正在运行的脚本正在执行的各个操作?换句话说,shell 脚本的退出代码是否只能被解释为最外层脚本的结果?
答案1
通常会打印一条错误消息并返回一个虚假状态:
# a.sh
if ! b.sh foo bar; then
echo >&2 "a.sh: b.sh failed"
exit 1
fi
if something else; then
echo >&2 "a.sh: some other error"
exit 1
fi
然后,如果您想使用不同的数字来分隔情况,您可以在a.sh
.如果您愿意,还可以检查返回的特定错误b.sh
,并使用它来决定从a.sh
.
当然,您也可以使用某种特定的格式构建错误消息,这样您就可以使用更长的文本标识符。
我不确定返回b.sh
直接 from返回的退出状态是否有意义a.sh
,因为后者甚至调用前者的事实应该是一个实现细节。除非 A 的整个功能是 B 的包装器,否则用户不需要关心 A 内部做了什么。此外,最初使用另一个工具的工具可以在以后进行修改,以自己完成相同的任务(如果这样更好的话)。或者相反,可以修改本身执行某些任务的工具以利用另一个现有工具,如果这可以减少代码重复。直接传递退出值会暴露这样的内部更改。
无论如何,如果调用者想要知道特定退出状态的含义(除了通用的“成功/失败”),则必须针对该特定工具对其进行记录。
话又说回来,如果您正在构建一个更大的工具库,您可以为各种情况创建一个通用的退出值系统,并为整个库记录该系统。
答案2
记录退出代码怎么样?
创造了良好的底线。但是,如果您希望/需要 的b.sh
退出代码对 的调用者直接可见 ,请考虑向的退出代码a.sh
添加偏移量 。b.sh
因此,例如,如果 b.sh
以 2 退出,
a.sh
则可以以 42(即 $?
+40)退出。