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