代码之家  ›  专栏  ›  技术社区  ›  kbanzai

bash美元?文件头始终为零

  •  1
  • kbanzai  · 技术社区  · 7 年前

    $? 返回最近执行的命令的退出状态。 它在终端中正常运行。 但是,如果我引用$?在文件的开头,它总是返回零,即使我在之前的终端中运行了以非零退出状态结束的命令。 例如

    $ 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
    

    ,其中测试。sh是

    #!/bin/bash
    echo $?
    

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Inian    7 年前

    这是因为脚本以 #!/bin/bash 总是 启动新的子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,从该父shell实例中可以创建一个具有pid的新shell实例 9040 已生成以运行您的脚本。

    但是您可以期望在寻找在中运行脚本的脚本时看到您的行为 相同的 如上所示,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