2

语境:

我有一个 bash 脚本(实际上是其他脚本的包装器),它执行以下伪代码:

do a main function
if the main function returns:
    $returncode = $? #most recent return code
if the main function runs longer than a timeout:
    kill the main function
    $returncode = 140 #the semi-canonical "exceeded allowed wall clock time" status

run a cleanup function
if the cleanup function returns an error: #nonzero return code
    exit $? #exit the program with the status returned from the cleanup function
else #cleanup was successful
    ....

问题:

最后一行之后应该发生什么?

如果清理函数成功,但主函数不成功,我的程序应该返回 0(用于成功清理),还是$returncode包含主函数的(可能非零且不成功)返回码?

对于特定的应用程序,答案很简单:“这取决于您需要脚本做什么。”

但是,这更像是一个一般/规范的问题(如果这是错误的地方,请用火杀死它):在 Bash(或一般的 Linux)编程中,您通常是否希望返回“意味着”的状态某些东西(即$returncode)还是您忽略这些主观性并简单地返回最新功能的代码?

这不是 Bash 特定的:如果我有任何类型的独立可执行文件,它在这些情况下应该如何表现显然,这有点值得商榷。即使有这些东西的系统,我相信很多人都会忽略它。都一样,我想知道。

干杯!

4

1 回答 1

4

从 main 返回退出代码。作为脚本的用户,我想知道它是否完成了它的工作,而不是它在失败后是否被清理。事实上,我希望程序/脚本在失败时能够正确清理,因此返回 0 会产生误导。

懒惰编写的脚本只是返回最后一个命令碰巧有的退出代码。编写良好的确保返回有意义的退出代码。


顺便说一句,我最喜欢的确保正确清理的方法是在trap EXIT.

WORKING_DIR=$(mktemp -d)

cleanUp() {
    rm -rf "$WORKING_DIR"
}

# Run cleanUp() when the script exits, whether that's from a SIGTERM/SIGINT or
# just exiting normally.
trap cleanUp EXIT
于 2012-08-28T21:32:02.523 回答