그들은 프로세스에 의해 범위가 지정됩니다
다른 응답자들은 쉘 변수 범위가 프로세스와 그 자손 에 관한 것임을 이해하도록 도와주었습니다 .
ls
명령 행에서 와 같은 명령을 입력하면 실제로 ls
프로그램 을 실행하기위한 프로세스가 실행 됩니다. 새로운 프로세스는 쉘을 부모로합니다.
모든 프로세스는 자체 "로컬"변수를 가질 수 있으며 자식 프로세스에는 전달되지 않습니다. 또한 "환경"변수를 설정할 수도 있습니다. 를 사용 export
하면 환경 변수가 생성됩니다. 두 경우 모두 관련없는 프로세스 (원본의 피어)는 변수를 볼 수 없습니다. 우리는 자식 프로세스가 보는 것을 통제하고 있습니다.
우리가 A라고 부르는 bash 쉘이 있다고 가정 해 봅시다. 당신은을 호출 bash
하는 하위 프로세스 bash 쉘을 작성합니다. 우리는 B라고 부릅니다 export
. A에서 호출 한 것은 여전히 B로 설정됩니다.
이제 B에서는이라고 말합니다 FOO=b
. 다음 두 가지 중 하나가 발생합니다.
- B가 A라는 환경 변수를받지 못하면
FOO
로컬 변수를 만듭니다. B의 자녀는 B를받지 않는 한 그것을받지 못합니다 export
.
- B 가 (A로부터) 호출 된 환경 변수를 수신 한 경우
FOO
, 그 자체와 그 이후 분기 된 자식에 대해 환경 변수 를 수정합니다 . B의 자녀에게는 B가 할당 한 값이 표시됩니다. 그러나 이것은 A에 전혀 영향을 미치지 않습니다.
다음은 간단한 데모입니다.
FOO=a # set "local" environment variable
echo $FOO # 'a'
bash # forks a child process for the new shell
echo $FOO # not set
exit # return to original shell
echo $FOO # still 'a'
export FOO # make FOO an environment variable
bash # fork a new "child" shell
echo $FOO # outputs 'a'
FOO=b # modifies environment (not local) variable
bash # fork "grandchild" shell
echo $FOO # outputs 'b'
exit # back to child shell
exit # back to original shell
echo $FOO # outputs 'a'
이 모든 것이 내 원래 문제를 설명합니다. GEM_HOME
쉘에 설정 했지만 호출 할 때 bundle install
자식 프로세스가 만들어졌습니다. 내가 사용하지 않았기 때문에 export
자식 프로세스는 쉘을받지 못했습니다 GEM_HOME
.
수출 금지
을 사용하여 변수를 "내보내기"할 수 있습니다 (자식으로 전달되지 않도록) export -n FOO
.
export FOO=a # Set environment variable
bash # fork a shell
echo $FOO # outputs 'a'
export -n FOO # remove environment var for children
bash # fork a shell
echo $FOO # Not set
exit # back up a level
echo $FOO # outputs 'a' - still a local variable
FOO=bar
현재 쉘 프로세스의 값을 설정합니다. 그런 다음 (bundle install
) 와 같은 프로그램을 실행하면 하위 프로세스가 생성되어 액세스 할 수 없습니다FOO
. 내가 말했다하지만export FOO=bar
, 자식 프로세스 (와 그 자손)는 것입니다 그것을에 액세스 할 수 있습니다. 그들 중 하나는 차례로export FOO=buzz
그 자손FOO=buzz
의 가치를 바꾸 거나 그 자체의 가치 만 바꾸 라고 요구할 수 있습니다 . 그게 맞습니까?