• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

bash 来源:Zac B 7次浏览

语境:给定一个主函数和一个清理函数,如何(规范地)在Bash/Linux中返回退出状态?

我有一个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特有的:如果我有任何类型的独立可执行文件,规范它应该在这些情况下表现吗?显然,这有些值得商榷。即使有这样的系统,我相信很多人都会忽略它。尽管如此,我想知道。

干杯!

===========解决方案如下:

从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 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)