쉘은 일반 변수를 어디에 할당합니까?

쉘은 일반 변수를 어디에 할당합니까?

아시다시피 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

관련 정보