无法捕获`/ bin / sh`的退出代码

时间:2018-01-16 20:15:33

标签: bash shell docker sh busybox

我使用/bin/bash作为最外层的shell,我使用/bin/sh中的默认busybox

下面,我能够像我期望的那样捕获退出代码:

$ 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

存储结果的位置,或者我如何捕获它?

2 个答案:

答案 0 :(得分:4)

变量以双引号扩展。这也适用于$?

$ 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

答案 1 :(得分:0)

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

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: $?