gpt4 book ai didi

bash - 给定一个主要功能和一个清理功能,我如何(规范地)返回 Bash/Linux 中的退出状态?

转载 作者:行者123 更新时间:2023-11-29 09:49:03 25 4
gpt4 key购买 nike

上下文:

我有一个 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

关于bash - 给定一个主要功能和一个清理功能,我如何(规范地)返回 Bash/Linux 中的退出状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com