"bash" 명령을 실행하면 하위 쉘이 생성되지 않습니까? [복사]

"bash" 명령을 실행하면 하위 쉘이 생성되지 않습니까? [복사]

명령을 실행할 때 하위 쉘을 만들지 않았나요 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는 이를 선택하지 않습니다.firefoxbashvalue

원천:

관련 정보