아시다시피 bash 쉘 자체는 프로세스입니다.
command 를 사용하면 쉘은 환경 변수가 있는 위치에 export a=c
변수를 동적으로 할당합니다 . a
(이 환경 부분은 프로세스의 메모리 디스크립터에 기술되어 있습니다.) 그래서 a
환경 부분에 변수가 할당된 것 같아요. 또는 명령에서 검색할 수 있습니다.printenv
그러나 command 를 사용할 때는 을 b=f
사용 echo $b
하고 변수 확장 작업을 수행합니다. 결과는 입니다 f
. 이 변수는 어디에서 왔습니까?
명령을 사용하면 echo $a
쉘이 환경 변수 섹션에서 이 변수를 로드한다는 것을 이해할 수 있습니다.
그러나 command 를 사용하면 echo $b
쉘은 이 변수를 어디에 로드합니까? 프로세스의 힙 부분인가요, 아니면 다른 곳인가요?
답변1
모든 쉘 변수는 동일한 저장소에 있습니다.
시작 시 모든 환경 변수를 가져옵니다.
새 명령이 시작되면 새 명령에 대한 새 환경이 생성됩니다. 내보내기로 표시된 모든 변수 또는 원래 환경에서 가져온 변수는 새 명령과 관련된 새 환경에 배치됩니다.
답변2
쉘이 실행되는 환경에 영향을 주지 않는 값을 할당하는 경우(이것이 가능한지는 모르겠습니다).
쉘은 모든 변수(적어도 작성된 변수)에 대해 내부 메모리를 사용합니다. 다음을 쉽게 볼 수 있습니다.
env - TESTVAR=foo bash
echo $TESTVAR
foo
TESTVAR=bar
echo $TESTVAR
bar
echo $$
13833
cat /proc/13833/environ
TESTVAR=foo