shell - 返回 shell 脚本中的最后一个非零返回码

标签 shell exit

我正在运行构建脚本并希望它完成,但如果出现问题则返回非零返回码。到目前为止,我知道的唯一方法是:

command1
rc1=$?

command2
rc2=$?

...

commandn
rcn=$?

exit $rc1 + $rc2 + ... + $rcn

是否有更好的方法来执行此操作,类似于 pipefail 但用于非管道命令?

更新:我实际上并不想要总和(我也不认为这是明智的)- 只是一个非零的错误返回。我正在运行一个脚本,如果出现问题,我希望构建失败,但要完成构建,这样即使某些验证检查失败,我们也可能处于可运行状态。

最佳答案

这可能不是你想要的

您可能不想添加错误代码,因为它们会变得毫无意义。相反,最好在您遇到第一个错误时退出并显示它。

您可以通过将命令与 && operator 链接在一起来完成此操作:

command1 \
&& command2 \
&& command3 \
|| echo "command failed: $?"

例如:

➤ echo show && (exit 188) && echo noshow || echo "failed: $?"
show
failed: 188

如果你必须...

您可以使用一个函数来包装您的命令,该函数将跟踪退出值:

SUM_EXIT=0

wrap() {
  eval "$@"
  SUM_EXIT=$(($SUM_EXIT+$?))
}

wrap command1
wrap command2
wrap command3

exit $SUM_EXIT

请注意,这是 (IMO) 对 eval 的完全有效使用。您将运行自己编写的命令。请注意可能包含换行符的奇怪文件名和参数。如果您不确定,请完整引用命令:

➤ wrap "(echo \"this is a 
newline containing string\" && exit 5)"
➤ echo $SUM_EXIT
5

关于shell - 返回 shell 脚本中的最后一个非零返回码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17308091/

相关文章:

python -c cmd 将等待所有进程完成

c - Bash 将脚本参数插入字符串

Perl,根据第二行中的值更改第一行中的值,

bash - 在命令替换中使用外部调用的陷阱会破坏父 Bash shell

vbscript - 有没有办法退出或中断 VBScript 中的 switch 语句?

python - os.system ('exit' ) 在 python 中

bash - 出错时自动退出 Bash shell 脚本

java - 退出应用程序时是否应该关闭所有资源?

linux - Shell 命令不适用于 TinyPNG 的压缩照片

php - 'die' 和 'exit' 之间的区别