한 터미널 창에서 환경 변수를 생성하고 이를 다른 터미널 창에 표시하려고 했습니다. 그것은 아무것도 보여주지 않습니다.
$TEST=hello
그 후 내보낸 후 echo
다른 터미널 창에서 다시 시도했습니다. 결과는 이전과 같습니다.
export TEST
그러나 로그인한 동안 동일한 코드를 실행하면(코드를 ~/.profile
파일에 추가) 모든 터미널 창에서 변수를 사용할 수 있습니다. 여기서 무슨 일이 일어나고 있는 걸까요? 터미널에서 코드를 실행하는 것과 로그인하여 코드를 실행하는 것의 차이점은 무엇인가요?
답변1
export
하위 프로세스 환경에 변수를 포함시킵니다. 다른 기존 환경에는 영향을 미치지 않습니다. 일반적으로 말하면, 한 터미널에서 변수를 설정하고 다른 터미널에서 자동으로 나타나게 하는 방법은 없으며 각 프로세스 자체에 환경이 설정됩니다.
.profile
로그인할 때마다 이 새 변수를 포함하도록 환경이 설정되도록 이를 환경에 추가하십시오 . 따라서 한 셸에서 다른 셸로 내보내는 것이 아니라 초기 환경을 설정할 때 새 셸에 이를 포함하도록 지시합니다.
답변2
각 프로세스에는 다른 프로세스와 독립적으로 설정할 수 있는 여러 속성이 있습니다. 예를 들어 리소스 제한, umask, 현재 디렉터리, 환경 변수 등이 있습니다. fork()
하위 프로세스는 프로세스가 생성될 때(시스템 호출을 통해 ) 상위 프로세스로부터 이러한 속성을 상속합니다. 그런 다음 하위 프로세스는 이러한 속성을 임의로 설정할 수 있습니다. (몇 가지 제한 사항이 있으며 프로세스는 하드 리소스 제한을 늘리거나 현재 디렉터리를 실행 권한이 없는 디렉터리로 변경할 수 없습니다.)
소수의 프로그램만이 환경 변수를 수정하며 대부분은 신경 쓰지 않습니다. 후자의 경우를 가정해보자. 따라서 하위 프로세스가 자체적으로 더 많은 하위 프로세스를 생성하는 경우 해당 프로세스는 상위 프로세스와 동일한 환경 변수를 갖게 됩니다. 등.
이제 쉘에는 볼 수 있는 많은 변수가 있습니다 set
(Bourne Shell 유형 쉘에서는 C 쉘에 대해 알지 못합니다). 이러한 변수는 편집되지 않는 한 환경 변수가 아닙니다 export
. 환경 변수는 를 통해 볼 수 있습니다 env
. 셸 명령줄에서 프로그램을 시작하면 프로그램은 셸에서 환경 변수를 상속합니다. 쉘 스크립트에서 실행되는 프로그램의 경우에도 마찬가지입니다.
따라서 로그인 시 프로필 데이터(예 ~/.profile
: )를 읽고 이를 거의 모든 자녀, 손주 등에게 상속하는 셸이 있습니다. 이는 환경 변수 설정이 로그인 쉘 또는 로그인 스크립트에서 로그인 세션에서 시작된 다른 모든 프로그램에 적용되는 방식입니다.
한 터미널 창에서 환경 변수를 생성하고 이를 다른 터미널 창에 표시하려고 했습니다. 그것은 아무것도 보여주지 않습니다.
위의 설명으로 보면 예상되는 결과입니다. 프로세스 환경에 대한 변경 사항은 이후 생성된 프로세스의 하위 프로세스에만 영향을 미치며 기존 프로세스에는 영향을 미치지 않습니다.
$TEST=hello
$TEST
그럼에도 불구하고 변수 확장이 비활성화되어 있거나 이미 적절한 값이 있지 않으면 작동하지 않을 것입니다 . hello
변수에 할당하려면 TEST
다음과 같이 말해야 합니다 TEST=hello
(참고: no $
).
그 후 내보낸 후
echo
다른 터미널 창에서 다시 시도했습니다. 결과는 이전과 같습니다.
이번에도 예상된 결과입니다.
그러나 로그인한 동안 동일한 코드를 실행하면(코드를
~/.profile
파일에 추가) 모든 터미널 창에서 변수를 사용할 수 있습니다.
이는 터미널의 셸이 ~/.profile
환경 설정을 읽은 셸의 하위 항목이므로 해당 설정을 상속하기 때문입니다.