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

时间:2017-12-27 10:23:26

标签: bash exit-code

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

$ 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)。

1 个答案:

答案 0 :(得分:4)

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

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

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

您可以从这里看到8080是父shell实例的pid,从中生成了一个带有pid 9040的新shell实例来运行您的脚本。

但是,您可以期望在使用在相同的 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