【问题标题】:one liner to execute function, check exit status and exit 0 if actual exit code was 0 or 1一个执行函数,检查退出状态,如果实际退出代码为 0 或 1 则退出 0
【发布时间】:2020-07-10 23:01:36
【问题描述】:

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

我尝试过这样的事情,其中​​(出口 1)代表程序:

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

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

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

谢谢!

【问题讨论】:

    标签: bash docker unix exit exit-code


    【解决方案1】:

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

    如果您的程序以代码 0 退出,则您无需执行任何操作。但是,您需要的是将代码 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)
    

    【讨论】:

    • 感谢您的见解,解决了问题。
    • 更简单,(exit 1); exit $(( $? > 1 ? $? : 0 ))
    【解决方案2】:

    在我的 dockerfile 中实现此功能时遇到了另一个问题,我将在此处说明我使用的解决方案,以防万一其他人遇到类似问题并遇到此问题。

    当我运行这个时:

    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 运行 RUN 命令,您必须事先添加 SHELL ["/bin/bash", "-c"] 以便此代码可以正常运行。然后它工作。

    【讨论】:

    • 这是因为“==”是特定于 bash 的,但您可以简单地使用“=”代替 posix 兼容(请参阅stackoverflow.com/a/20449556/2679935
    • 似乎总是有太多我不知道的细节... x-0 谢谢!
    • 我也不知道,但我必须寻找它才能知道为什么你会收到这条消息 :) 在我的 Linux 发行版上,sh 实际上是指向bash 的符号链接,所以我以前从来不用关心这个!
    猜你喜欢
    • 2017-01-22
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多