使用 set -e 解决程序退出状态的一般解决方案

Posted

技术标签:

【中文标题】使用 set -e 解决程序退出状态的一般解决方案【英文标题】:General solution for a program's exit status with set -e 【发布时间】:2018-07-06 07:47:21 【问题描述】:

我现在在 Bash 中编程,我使用 set -e,因为在程序失败时继续执行脚本几乎不是想要的行为。

如果不需要退出代码,我会使用||true

如果我需要退出代码,我会像这样包装执行:

set +e
call_I_need_the_exit_code with few arguments
RV="$?"
set -e
# use "$RV" somewhat

但是,它很冗长,我很少切换 set +eset -e 引入恼人的错误。

有没有办法制作一个函数来执行命令并为退出代码设置一个已知变量?

类似这样的东西(伪代码):

safe_call( call_I_need_the_exit_code(with, few, arguments) )
# use "$RV" somewhat

safe_call 基本上完成了前面的代码块。这将使我的代码更易于编写和阅读...

【问题讨论】:

显然“shell将最近执行的命令的退出值存储在变量'?' " 您最近的编辑没有任何意义。特别是,A="es" 只是一个不调用函数es 的字符串赋值;并且您需要在右大括号之前使用换行符或分号。无论如何,您的问题应该仍然是一个严格的问题。请考虑回滚此编辑;如果您真的认为我的问题无法理解,请随时发布您自己的答案(如果您想澄清一些问题,请提交修改建议)。 真的很奇怪,我复制并粘贴了一个文件,那里肯定有反引号!编辑:反引号需要反斜杠。 不过,问题应该只是一个问题。如果您愿意,可以在下面的答案框中提交您自己的答案;但不应编辑您的问题以包含答案或切线评论。进一步查看help center,或者如果您需要进一步澄清堆栈溢出政策,请在Meta Stack Overflow 上发布单独的问题。 我回滚了你最近的编辑。如果您想将内容发布为答案,它们仍然可以在 revision history 中看到。 【参考方案1】:

|| true 起作用的原因是条件在set -e 下是安全的。这可以很容易地扩展到您的场景。

command && rv=0 || rv=$?

顺便说一句,你应该avoid uppercase for your private variables.

【讨论】:

这个答案的第一个版本试图将它包装在一个函数中,但这显然 set -e 下是安全的;对此感到抱歉。 好主意,事后看来很明显,因为我喜欢它。替代方案可能是:&&rv=$?||rv=$?(允许无意识写作)或rv=0 更早,只是||rv=$?。关于大写,我没有在这里编写代码约定……老实说,我有点喜欢变量,也不同于 shell 命令。无论如何,感谢您将我指向 Google 的 Shell 样式指南,因为它肯定是一本好书。

以上是关于使用 set -e 解决程序退出状态的一般解决方案的主要内容,如果未能解决你的问题,请参考以下文章

怎样正确退出Keil的调试状态

第52课 命令行参数的应用

无法使用前端 xxx 解决:rpc 错误:代码 = 未知 desc = (...) 输出:`退出状态 2:gpg:解密失败:没有密钥`

Hibernate

第五十二课命令行参数的应用

请问高手,做ABAP报表执行后无法退出,有时候显示“用户接口ZTEST01的状态SET_PF1丢失”,这是为啥呢?