シェルレベルとサブシェルの私の理解は次のとおりです。
サブシェルは、
( ... )
構文によって生成されたシェルプロセス(実行者ではない)の分岐です。$SHLVL
シェル実行者の数を数えます。$BASH_SUBSHELL
サブシェルの生成を計算します。
ただし、次の例を考えてみましょう。
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行目と同じようにスクリプトを実行します。サブシェルを作成しません(ライン5はサブシェルを作成します)。
編集する: テストに使用されたBashバージョンは5.0.3(1)リリースです。