[unix] 쉘 변수와 환경 변수. 둘 다 같은 이름을 가진다면 어떤 것이 선호됩니까?

Bash에 다음을 입력하십시오.

env | grep USER

set | grep USER

두 번 동일한 사용자 이름을 제공합니다.

예를 들어 echo $USER쉘 또는 환경 변수가 표시된 경우 입력하는 경우 어떻게 알 수 있습니까?



답변

들어 POSIX 호환 쉘 (배쉬 포함), 표준 말한다 :

2.5.3 쉘 변수
변수는 환경에서 초기화되어야합니다 […] 변수가 환경에서 초기화되면 즉시 내보내기가 가능하도록 표시되어야합니다. 수출 특별 내장을 참조하십시오. 변수 할당 등으로 새로운 변수를 정의하고 초기화 할 수 있습니다 [etc.]

그리고 약 export:

export name[=word]...
쉘은 지정된 이름에 해당하는 변수에 내보내기 속성을 제공해야하며, 이로 인해 이후에 실행되는 명령 환경에있게됩니다.

따라서 쉘의 관점에서 변수 만 있습니다. 일부는 쉘이 시작될 때 환경에서 왔을 수 있으며, 일부는 쉘이 시작하는 프로세스 환경으로 내 보내질 수 있습니다.

( “환경”은 실제로 프로세스가 시작될 때 프로세스에 전달되는 문자열입니다. 프로세스가 실행 중일 때 원하는대로 수행하고, 사용하고, 무시하고, 덮어 씁니다. 물론 다른 프로세스를 시작할 때 또 다른 일이 될 수 있지만 물론 모든 환경 변수를 다시 전달하는 것이 일반적입니다.)


POSIX 이외의 쉘 (예 :)을 사용하는 경우 csh상황이 다를 수 있습니다.

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit


답변

이것들은 하나의 동일한 변수입니다. 대부분의 다른 프로그래밍 언어와 달리 셸에서 환경 변수와 셸 변수는 동일한 네임 스페이스를 공유합니다. 셸에서 환경 변수는로 내 보낸 셸 변수입니다 export.

예를 들어, 이전 질문에 대한 나의 답변 ” 쉘 변수와 환경 변수의 사용법에 어떤 차이가 있습니까?


답변

셸 변수는 현재 셸에만 사용할 수 있으며 시스템 전체에서는 사용할 수 없습니다. 다른 한편으로 환경 변수는 시스템 전체에서 사용될 수 있습니다. 일반적으로 쉘 변수는 소문자로 작성되고 환경 변수는 대문자로 작성됩니다. 쉘 변수를 환경 변수로 작동하게 만들 수 있습니다. 내보내기 만하면됩니다.


답변