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

标签 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

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

最佳答案

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

$ 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

关于bash - 无法捕获 `/bin/sh`的退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48289127/

相关文章:

linux - 使用 awk 格式化文本

android - 如何使用 adb 在 bash 脚本中以读写方式重新安装我的 Android/系统?

shell - 如何在 Makefile 中获取脚本源?

bash - 使用 shell 脚本过滤目录列表

mysql - pi 上的一次性启动脚本

Docker通过子进程运行

c - 在C中将图像转换为黑白的问题

docker-compose 退出代码 141

mysql - Bluemix `docker exec` 返回 404

bash - 如何在 Bash 中使用读取命令?