shell 级别到底是什么?

shell 级别到底是什么?

我对 shell 级别和子 shell 的理解是:

  1. 子 shell 是由( ... )构造创建的 shell 进程的分支(但不是执行程序)。

  2. $SHLVL计算 shell 执行人员的数量。

  3. $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。

相关内容