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

Unable to capture the exit code of `/bin/sh`

我正在使用 /bin/bash 作为最外层的 shell,并且我正在使用来自 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

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

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

$ 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

你看到这个是因为变量扩展在命令执行之前完成。尝试转义 $?:

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