쉘 레벨과 서브쉘에 대한 나의 이해는 다음과 같습니다.
서브쉘은
( ... )
구문에 의해 생성된 쉘 프로세스(실행자는 아님)의 분기입니다.$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) 릴리스입니다.