bash $?在文件头部始终为零

bash $? is always zero at the head of a file

$? returns 最近执行命令的退出状态。 它 运行 在终端中正确。 但是,如果我参考 $?在文件的头部,它 returns 始终为零,即使我 运行 之前在终端中以非零退出状态结束的命令也是如此。 例如,

$ cat foo.txt; echo $?
cat: foo.txt: No such file or directory
1
$ cat foo.txt; ./test.sh
cat: foo.txt: No such file or directory
0

,其中 test.sh 是

#!/bin/bash
echo $?

这是正确的行为吗? (我使用 GNU bash,版本 4.4.12)。

这是因为以#!/bin/bash开头的脚本总是启动一个新的子shell和前一个shell的退出代码shell 丢失。最后的 运行 退出代码仅保留在当前实例中,不会传播给子实例

见下面的输出。我在 echo $? 之后添加了一个新行 echo $BASHPID 来打印新 shell 的当前流程实例(从 BASHPID 看到)。如您所见,失败案例中的编号与 运行ning 脚本中的编号不同。

echo $BASHPID; cat nosuchfile; bash script.sh
8080
cat: nosuchfile: No such file or directory
0
9040

你可以从这里看到 8080 是父 shell 实例的 pid,从中产生了 pid 9040 的新 shell 实例到 运行 你的脚本。

但是您可以期望在采购脚本时看到您的行为,如您所见,运行s 是 same shell 实例中的脚本以上。

echo $BASHPID; cat nosuchfile; source script.sh
8080
cat: nosuchfile: No such file or directory
1
8080

此处的退出代码 1 对应于 cat 因无法打开文件而抛出的代码。

已修改script.sh

#!/bin/bash
echo $?
# Print current shell process id
echo $BASHPID