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
$? 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