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