为什么 $BASH_SUBSHELL 不能与 /bin/bash shebang 一起使用

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

做了一些测试,我发现在脚本中设置 bash shebang 会取消 $BASH_SUBSHELL 行为。

# in the terminal
$ echo $BASH_SUBSHELL
0
$ (echo $BASH_SUBSHELL)
1

script_no_shebang.sh

echo $BASH_SUBSHELL
$ ./script_no_shebang.sh
0
$ test=$(./script_no_shebang.sh)
$ echo $test
1

script_shebang.sh

#!/bin/bash
echo $BASH_SUBSHELL
$ ./script_shebang.sh
0
$ test=$(./script_shebang.sh)
$ echo $test
0

知道这是错误还是预期行为?

我尝试了上面测试的几种组合。使用很多 bash 函数,我不认为自己会删除 shebang 以使用 $BASH_SUBSHELL。

bash shebang subshell
1个回答
0
投票

当脚本以 shebang 开头时,操作系统内核将 shebang 作为命令执行,并以脚本名称作为参数。所以相当于跑步

/bin/bash ./script_shebang.sh

这将启动一个新的

bash
进程,将子 shell 级别初始化为
0

当没有 shebang 时,shell 会在子 shell 中执行脚本本身,因此它会增加子 shell 级别。

如果你这样做,你可以看到相当于 shebang 的东西

test=$(/bin/bash ./script_no_shebang.sh)

基本上,启动一个新的

bash
实例与子 shell 不同。

© www.soinside.com 2019 - 2024. All rights reserved.