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


10

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

env | grep USER

set | grep USER

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

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

답변:


14

들어 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

1
csh와 같은 Bourne 쉘은 환경 변수에서 쉘 변수를 초기화합니다. 그러나 셸 변수를 수정해도 내 보내지 않는 한 해당 환경 변수에 영향을 미치지 않습니다. 그것은 Korn 쉘에 의해 깨졌고 POSIX에 의해 지정되었습니다. 그렇기 때문에 스크립트에서 실행하는 명령에 영향을 줄 수있는 env vars를 수정하지 않도록 지금 사용하는 쉘 변수의 이름에주의해야합니다.
Stéphane Chazelas

4

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

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


나는 당신의 설명을 다시 읽을 것입니다. 나는 당신의 대답을 이해하기 전에 먼저 몇 가지를 배워야합니다.
상어

@sharkant 전혀 걱정하지 마십시오. 내가 혼란 스러우면 그냥 말해 주면 설명하려고 노력하겠습니다. ilkkachu의 대답도 좋습니다.
Kusalananda

아니, 나는 그렇게 생각하지 않습니다, 당신은 좋은 스타일의 설명을 가지고 있습니다.
상어

2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.