普通 shell 与子 shell 与“bash -c”最后命令退出代码

普通 shell 与子 shell 与“bash -c”最后命令退出代码

&&我正在尝试正确获取与和链接的最后一个命令的退出代码||

我遇到了一个无法解释的奇怪行为。请帮忙。

这是我的exit-code.sh测试脚本:

#!/bin/bash
echo "running exit-code with $1"
exit $1

这按预期工作:

$ ./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?
running exit-code with 1
last command exit code: 1

()与在子 shell 中运行它相同:

$ (./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)
running exit-code with 1
last exit code: 1

但:

$ /bin/bash -c "./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?"
running exit-code with 1
last exit code: 0

为什么我在这里得到退出代码 0?

答案1

为什么我在这里得到退出代码 0?

原因是,使用双引号时,$?在将参数传递给新的 Bash 进程之前会进行参数扩展(特殊参数的扩展)。如果打开调试和详细模式,可以清楚地看到这一点:

$ set -xv
$ bash -c "(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)"
bash -c "(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?)"
+ bash -c '(./exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: 0)'
running exit-code with 1
last exit code: 0
$ set +xv

在这种情况下$?设置为,0因为前一个命令(set -xv在此示例中)已成功执行。

答案2

引号

只需使用单引号

/bin/bash -c './exit-code.sh 1 && ./exit-code.sh 2 && ./exit-code.sh 3 || echo last exit code: $?'

running exit-code with 1
last exit code: 1

相关内容