一个执行功能的班轮,检查退出状态,如果实际退出代码为 0 或 1,则退出 0

one liner to execute function, check exit status and exit 0 if actual exit code was 0 or 1

我是 运行 一个退出代码为 0 或 1 表示成功的程序。我在构建 docker 图像时 运行,因此如果 return 代码不为 0,则构建失败。如果实际退出代码为 0 或 1,我如何捕获退出代码并强制退出代码为 0,以便 docker 图像可以正确构建?

我试过这样的方法,其中 (exit 1) 代表程序:

((exit 1) && if [ $? == 0 || $? == 1]; then exit 0; else exit 1; fi;)

但它不起作用,退出代码 1 仍然以 1 退出。

我宁愿不做 program || true 以防程序因某种原因确实失败了

谢谢!

这里的问题是 exit 0 有一个 truthy 值,而 exit 1 具有 falsy 值。这意味着您的条件的右侧部分仅在第一部分为真时执行(因为 && 运算符)。

如果您的程序以代码 0 退出,则您无事可做。但是,您想要的是 "transform" 代码 1 到代码 0。为此,您需要 || 运算符。

这应该有效:

((exit 1) || if [ $? = 1 ]; then exit 0; else exit 1; fi)

要检查的几个测试(我更改了退出代码值以更好地了解发生了什么):

$> ((exit 0) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
0  # the right-part of the condition is ignored
$> ((exit 1) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
2  # the exit code 1 is "converted" into an exit code 2 (or 0 in your case)
$> ((exit 2) || if [ $? = 1 ]; then exit 2; else exit 3; fi); echo $?
3  # the exit code 2 is "converted" into an exit code 3 (or 1 in your case)

我 运行 在我的 docker 文件中实现这个时遇到了另一个问题,我会在这里注明我使用的解决方案,以防万一其他人有类似的问题并遇到这个问题.

当我运行这个:

RUN (update_blastdb.pl --decompress taxdb || if [ $? == 1 ]; then exit 0; else exit 1; fi;)

我收到一条错误消息:

Downloading taxdb.tar.gz... [OK]
Decompressing taxdb.tar.gz ... [OK]
/bin/sh: 1: [: 1: unexpected operator
The command '/bin/sh -c (update_blastdb.pl --decompress taxdb || if [ $? == 1 ]; then exit 0; else exit 1; fi;)' returned a non-zero code: 1

显然 docker 不会 运行 默认使用 bash 的 运行 命令,您必须事先添加 SHELL ["/bin/bash", "-c"] 以便此代码可以运行 正确。然后就可以了。