シェルレベルとは何ですか?

シェルレベルとは何ですか?

シェルレベルとサブシェルの私の理解は次のとおりです。

  1. サブシェルは、( ... )構文によって生成されたシェルプロセス(実行者ではない)の分岐です。

  2. $SHLVLシェル実行者の数を数えます。

  3. $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)リリースです。

関連情報