쉘 변수와 환경 변수, 둘 다 동일한 이름을 갖는 경우 어느 것이 선호됩니까?

쉘 변수와 환경 변수, 둘 다 동일한 이름을 갖는 경우 어느 것이 선호됩니까?

Bash에 다음을 입력합니다.

env | grep USER

그리고

set | grep USER

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

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

답변1

~을 위한POSIX 호환 쉘(Bash 포함) 표준은 다음과 같이 말합니다.

2.5.3 쉘 변수
변수는 환경에서 초기화되어야 합니다.[...] 변수가 환경에서 초기화되면 즉시 내보내기용으로 표시되어야 합니다. 전용 내장 내보내기를 참조하세요. 변수 할당을 통해 새로운 변수를 정의하고 초기화할 수 있으며,[등. ]

또한 약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

답변2

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

예를 들어 이전 질문에 대한 내 답변을 참조하세요."쉘 변수와 환경 변수 사용법의 차이점은 무엇입니까?"

답변3

쉘 변수는 시스템 전체가 아닌 현재 쉘에서만 사용할 수 있습니다. 반면에 환경 변수는 시스템 전체에서 사용될 수 있습니다. 관례적으로 쉘 변수는 소문자로 작성되고 환경 변수는 대문자로 작성됩니다. 쉘 변수를 내보내서 환경 변수로 작동하도록 할 수 있습니다.

관련 정보