【问题标题】:Unable to capture the exit code of `/bin/sh` [duplicate]无法捕获`/bin/sh`的退出代码[重复]
【发布时间】:2018-06-25 15:02:36
【问题描述】:

我使用/bin/bash 作为最外层的外壳,并且我使用来自busybox 的默认/bin/sh。

在下面,我可以按预期捕获退出代码:

$ docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" && echo Shell Result: $?" || echo Docker Result: $?
cat: can't open '/foo/bar': No such file or directory
Docker Result: 1

显然cat /foo/bar 失败了,这是我们在|| 另一边输入语句的方式。但是,当我尝试回显结果时,$? 的值是0(如下所示):

$ docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" || echo Shell Result: $?" || echo Docker Result: $?
cat: can't open '/foo/bar': No such file or directory
Shell Result: 0

结果存储在哪里,或者我如何捕获它?

【问题讨论】:

    标签: bash shell docker sh busybox


    【解决方案1】:

    变量在双引号中展开。这也适用于$?。

    $ true; /bin/sh -c "cat /foo/bar || echo Result: $?"
    cat: /foo/bar: No such file or directory
    Result: 0
    $ false; /bin/sh -c "cat /foo/bar || echo Result: $?"
    cat: /foo/bar: No such file or directory
    Result: 1
    

    解决方法:使用单引号或转义$:

    $ true; /bin/sh -c 'cat /foo/bar || echo Result: $?'
    cat: /foo/bar: No such file or directory
    Result: 1
    $ true; /bin/sh -c "cat /foo/bar || echo Result: \$?"
    cat: /foo/bar: No such file or directory
    Result: 1
    

    【讨论】:

      【解决方案2】:

      您看到这一点是因为在命令执行之前对其进行了变量扩展。尝试转义 $?:

      docker run -it --rm busybox /bin/sh -c "bin/sh -c \"cat /foo/bar\" || echo Shell Result: \$?" || echo Docker Result: $?
      

      或者,如果您的命令中不需要任何其他变量扩展,只需使用单引号(那么您也不需要转义内引号):

      docker run -it --rm busybox /bin/sh -c 'bin/sh -c "cat /foo/bar" || echo Shell Result: $?' || echo Docker Result: $?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2018-04-26
        • 2019-03-05
        • 1970-01-01
        • 2018-12-11
        相关资源
        最近更新 更多