我使用/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
存储结果的位置,或者我如何捕获它?
答案 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: $?