명령을 실행할 때 하위 쉘을 만들지 않았나요 bash
? 예를 들어 실행 후에는 bash
내보내지 않은 변수의 값에 액세스할 수 없습니다. 그렇다면 bash 명령을 사용하여 전환한 환경은 현재 bash 쉘에서 실행되는 하위 쉘이 아닌가요?
:~$ value="testing"
:~$ echo $value
testing
:~$ bash
:~$ ps f
PID TTY STAT TIME COMMAND
82 tty1 S 0:00 -bash
97 tty1 S 0:00 \_ bash
124 tty1 R 0:00 \_ ps f
:~$
:~$ echo $value
:~$ exit
exit
:~$ export value
:~$ bash
:~$ echo $value
testing
:~$
답변1
아니요, 이것은 서브쉘이 아닙니다. Bash의 하위 쉘은 이 변수로 표시됩니다 BASH_SUBSHELL
. 각 하위 쉘 수준에 대해 값이 1씩 증가합니다.
$ echo $BASH_SUBSHELL
0
$ ( echo $BASH_SUBSHELL )
1
$ ( ( echo $BASH_SUBSHELL ) )
2
$ ( ( ( echo $BASH_SUBSHELL ) ) )
3
$ ( ( ( ( echo $BASH_SUBSHELL ) ) ) )
4
$ ( ( ( ( ( echo $BASH_SUBSHELL ) ) ) ) )
5
그러나 다른 셸을 시작하면 이 변수는 변경되지 않습니다.
$ echo $BASH_SUBSHELL
0
$ bash
$ echo $BASH_SUBSHELL
0
새로운 bash 쉘을 실행하면 완전히 새로운 인스턴스가 되기 때문입니다. 예, 내보낸 변수는 상속됩니다.어린이원래 bash 인스턴스의 셸이지만 위에서 볼 수 있듯이 실제로는 해당 인스턴스의 하위 셸이 아닙니다. 서브쉘은 내보낸 변수뿐만 아니라 모든 변수를 상속합니다.
$ foo=var
$ ( echo $BASH_SUBSHELL; echo $foo )
1
var
$ bash
$ echo $var ## <-- prints an empty line
이는 (강조) COMMAND EXECUTION ENVIRONMENT
에도 설명되어 있습니다.man bash
서브셸 환경에서 명령 대체, 대괄호 그룹 명령 및 비동기 명령 호출이것은 쉘 환경의 복사본입니다.단, 쉘에 잡힌 트랩은 호출 시 부모로부터 쉘에 상속된 값으로 재설정됩니다. 파이프라인의 일부로 호출되는 내장 명령은 서브셸 환경에서도 실행됩니다. 서브쉘 환경에 대한 변경은 쉘의 실행 환경에 영향을 주지 않습니다.
따라서 하위 셸 환경은 내보낸 변수뿐만 아니라 모든 변수를 포함하여 상위 셸과 거의 동일한 복사본입니다.
답변2
명령 실행 환경 부분배쉬 매뉴얼:
내장 함수나 쉘 함수가 아닌 단순 명령을 실행하고자 하는 경우에는 다음과 같이 구성된 별도의 실행 환경에서 호출된다. 달리 명시하지 않는 한 이러한 값은 셸에서 상속됩니다.
- 쉘 변수와 함수수출용으로 표시, 명령을 위해 내보낸 변수는 환경에 전달됩니다.
그러므로:
bash
내장 함수나 쉘 함수가 아니라 서브쉘에서 실행됩니다.상위 셸에서 내보내기용으로 표시된 변수를 상속합니다.
실험에서 알 수 있듯이
value
서브bash
쉘은 .
이것은 bash
당신이 얻는 쉘이 서브쉘이라는 것을 의미하는 것이 아니라, 서브쉘에서 실행되어 그것을 대체했다는 것을 의미합니다. 따라서 관련된 서브쉘은 임시적이고 단지 중개자일 뿐입니다.
아래 그림을 참조하세요.
차트의 경우지름
를 입력하면 bash
현재 쉘이 분기되어 동일한 쉘이 생성됩니다. 노란 남매는 주황 exec
남매를 기다린다 bash
. 이는 모든 환경 변수가 상속되는 것이 아니라 내장되지 않은 명령( zsh
, g++
, ...)에서도 발생합니다. 그러나 환경 변수 중 하나가 아니고 내보내지지 않기 때문에 blue Bash는 이를 선택하지 않습니다.firefox
bash
value
원천:
- 배쉬 매뉴얼.
- 자일스의 대답"서브쉘은 서브쉘과 동일합니까?"
- 강무의 대답"명령 대체를 통해 환경이 아닌 변수가 서브쉘에 전달되는 이유는 무엇입니까?"
- 댓글 섹션Telden의 답변.