我对 shell 级别和子 shell 的理解是:
子 shell 是由
( ... )
构造创建的 shell 进程的分支(但不是执行程序)。$SHLVL
计算 shell 执行人员的数量。$BASH_SUBSHELL
计算子 shell 的创建。
但是请考虑以下示例:
1: $ cat lvltest.sh
#!/bin/bash
pstree $1
echo "SUBSHELL LEVEL = $BASH_SUBSHELL"
echo "SHELL LEVEL = $SHLVL"
2: $ . lvltest.sh $$
bash───pstree
SUBSHELL LEVEL = 0
SHELL LEVEL = 1
3: $ ./lvltest.sh $$
bash───lvltest.sh───pstree
SUBSHELL LEVEL = 0
SHELL LEVEL = 2
4: $ ( ./lvltest.sh $$ )
bash───lvltest.sh───pstree
SUBSHELL LEVEL = 0
SHELL LEVEL = 1
5: $ ( . lvltest.sh $$ )
bash───bash───pstree
SUBSHELL LEVEL = 1
SHELL LEVEL = 1
我不明白为什么第 4 行输出与第 3 行输出不同。
第 4 行执行 bash exec 并运行脚本,与第 3 行完全相同。它不会创建子 shell(第 5 行创建子 shell)。
编辑: 用于测试的 Bash 版本是 5.0.3(1)-release。