如何处理嵌套脚本中的错误和退出?

How to handle errors and exit in nested scripts?

我有一个 unix bash 脚本 1,它调用脚本 2,2 调用 3A、3B 和 3C。此外,如果在执行这些脚本时出现任何错误,我想通过电子邮件发送 QA。

假设我想检查 3B 运行 是否成功(并在失败时通知 QA),我应该在 3B 中的每个命令后检查退出代码(这将是很多错误处理)还是我可以从脚本 2(即调用者)检查 3B 的整体执行是否成功吗?第一个选项的另一个缺点是我必须退出 3 次(即 3B、2、1)

将每个脚本视为一个独立的程序。调用脚本只关心被调用脚本是成功还是失败。因此每个脚本都必须 return 准确的退出状态——成功时为零,失败时为非零。

script1 内,您有:

if script2
then : OK
else mailx -s "script2 failed inside script1" qa@example.com <<< EOM
     exit 1
fi

script2 内,您有:

if ! script3A
then mailx -s "script3A failed inside script2" qa@example.com <<< EOM
     exit 1
elif ! script3B
then mailx -s "script3B failed inside script2" qa@example.com <<< EOM
     exit 1
elif ! script3C
then mailx -s "script3C failed inside script2" qa@example.com <<< EOM
     exit 1
else : OK
fi

您可以考虑使用set -e,但是您必须担心如何将电子邮件发送给QA。

如果您需要从命令中获取标准输出以供质量检查人员使用,则需要更加努力。 如果您需要捕获标准错误以发送给 QA,那么它又会变得更难。

如果您决定不需要知道到底是什么失败了,您可以简化代码,尤其是在 script2.