Bash - 如何检索 'or' 语句中第一个命令的退出状态

Bash - how to retrieve exit status of first command in an 'or' statement

在 gitlab 的脚本中,我有以下语句: locust || true 这是因为如果 locust 命令因某些退出代码而失败,我不希望 gitlab CI 停止阶段的执行。但是我怎样才能检索 locust 语句

的退出代码

如果您将命令放在 if 语句中而不是使用 || true,失败将不会导致脚本退出,您将能够保存退出代码。

if locust; then
    rc=0
else
    rc=$?
fi

echo locust exited with rc=$rc

PS:您不能只执行 if ! locust; then...,因为在那种情况下,! 会反转退出代码的逻辑。您实际上需要 else 块才能让 rc=$? 以您想要的方式工作。

PPS:是的,我更喜欢那个答案,rc=0; locust || rc=$?...我早该想到的!

您可以将 true 替换为变量赋值:

rc=0; locust || rc=$?

如果在设置了 errexit 的上下文中,您希望确保整个 return 代码始终是 0,即使分配奇迹般地失败了,只是 re-attach || true:

rc=0; locust || rc=$? || true

更进一步:

如果您希望在第一个命令失败时执行下一个命令而不是文字 true,则否定 ! 变量赋值使其失败,以便继续进行评估第二个 ||.

# For personal use only!
rc=0; first-cmd || ! rc=$? || next-cmd

但在这里要小心(在逻辑上连接命令时一如既往):不要在生产上下文中使用此快捷方式!而是执行单独的检查以查看是否满足执行该命令的所有先决条件。

回答问题的“蝗虫方面”:如果 运行 完全失败,您可以传递 —exit-code-on-error 0 以仅给出 non-zero 退出代码,而不是响应失败。

(不知道为什么这不是默认设置,但现在更改它会破坏内容,所以我可能不会)