普通 shell vs subshel​​l vs "bash -c" 最后一个命令退出代码

Gre*_*cki 6 shell bash

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

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

我使用这个测试脚本返回给定的退出代码:

gdubicki@mbp-greg:~ $ cat exit-code.sh
#!/bin/bash
echo "running exit-code with $1"
exit $1
Run Code Online (Sandbox Code Playgroud)

这按预期工作:

gdubicki@mbp-greg:~ $ ./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

gdubicki@mbp-greg:~ $ (./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
Run Code Online (Sandbox Code Playgroud)

但:

gdubicki@mbp-greg:~ $ /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
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*gan 4

为什么我在这里得到退出代码 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
Run Code Online (Sandbox Code Playgroud)

在本例中$?设置为0因为先前的命令(set -xv在本示例中)执行成功。