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

问题描述 投票:1回答:1

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

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

bash exit-code
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.