做了一些测试,我发现在脚本中设置 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。
当脚本以 shebang 开头时,操作系统内核将 shebang 作为命令执行,并以脚本名称作为参数。所以相当于跑步
/bin/bash ./script_shebang.sh
这将启动一个新的
bash
进程,将子 shell 级别初始化为 0
。
当没有 shebang 时,shell 会在子 shell 中执行脚本本身,因此它会增加子 shell 级别。
如果你这样做,你可以看到相当于 shebang 的东西
test=$(/bin/bash ./script_no_shebang.sh)
基本上,启动一个新的
bash
实例与子 shell 不同。