给定一个main函数和一个cleanup函数,我如何(规范地)在Bash/Linux中返回退出状态?

给定一个main函数和一个cleanup函数,我如何(规范地)在Bash/Linux中返回退出状态?,bash,return,return-value,conventions,canonical-form,Bash,Return,Return Value,Conventions,Canonical Form,背景: 我有一个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-canon

背景:

我有一个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
    ....
问题:

在最后一行之后会发生什么

如果cleanup函数成功,但main函数没有成功,那么我的程序是否应该为成功的cleanup返回0,或者$returncode,其中包含main函数的可能非零和不成功的返回代码

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

然而,这更像是一个一般性/规范性的问题,如果这是一个错误的地方,那么就用火杀死它:在Bash或Linux的通用编程中,您通常希望返回表示某种意义的状态,例如$returncode,还是忽略这些主观性,只返回最新函数的代码

这不是Bash特有的:如果我有一个任何类型的独立可执行文件,在这些情况下,它应该如何规范地运行?显然,这有点争议。即使有这样一个系统,我相信很多人都忽视了它。尽管如此,我还是想知道


干杯

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

懒散编写的脚本只会返回上一个命令的退出代码。编写良好的代码确保返回有意义的退出代码

顺便说一下,我最喜欢的确保正确清理的方法是在陷阱出口上运行清理功能


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

懒散编写的脚本只会返回上一个命令的退出代码。编写良好的代码确保返回有意义的退出代码

顺便说一下,我最喜欢的确保正确清理的方法是在陷阱出口上运行清理功能


尽管在某些版本的Bash上,EXIT伪信号并不管理TERM和/或INT事件。最安全的方法是执行陷阱清理INT TERM EXIT,尽管在某些版本的Bash上,EXIT伪信号不管理TERM和/或INT事件。最安全的方法是在退出时进行陷阱清理
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