각 프로세스에는 프로세스가 다른 프로세스와 개별적으로 독립적으로 설정할 수있는 몇 가지 속성이 있습니다. 자원 제한, umask, 현재 디렉토리, 환경 변수 등이 그 예입니다. 프로세스 작성시 ( fork()
시스템 호출을 통해) 하위는이 속성을 상위에서 상속합니다. 이 후 자식 프로세스는 이러한 속성을 임의로 설정할 수 있습니다. (일부 제한 사항이 적용되면 프로세스가 하드 자원 제한을 늘리거나 현재 디렉토리를 실행 권한이없는 디렉토리로 변경할 수 없습니다.)
환경 변수를 수정하는 프로그램은 거의 없으며 귀찮게하지 않습니다. 후자의 경우를 가정 해 봅시다. 따라서 자식 프로세스가 더 많은 자식을 만들면이 프로세스는 조부모와 동일한 환경 변수를 갖습니다. 등등.
이제 쉘에는 볼 수있는 많은 변수가 있습니다 set
(Bourne Shell 유형의 쉘에서는 C 쉘에 대해 dunno). 이러한 변수는 환경 변수가 아닌 한 환경 변수가 아닙니다 export
. 환경 변수는로 볼 수 있습니다 env
. 쉘 명령 행에서 프로그램을 시작하면 프로그램은 쉘에서 환경 변수를 상속합니다. 쉘 스크립트에서 시작된 프로그램도 마찬가지입니다.
따라서 로그인시 프로파일 데이터 (예 :)를 읽고 ~/.profile
거의 모든 어린이, 손자 등에 게 상속 하는 쉘이 있습니다. 이것은 환경 변수 설정이 로그인 쉘 또는 로그인 스크립트에서 로그인 세션 내에서 시작된 다른 모든 프로그램으로 흘러가는 방식입니다.
한 터미널 창에서 환경 변수를 만들고 다른 터미널 창에서 환경 변수를 에코하려고했습니다. 그것은 아무것도 표시하지 않았습니다.
위의 설명에 따르면, 이것은 예상 된 결과입니다. 프로세스 환경의 변경은 기존 프로세스가 아니라 이후에 작성된이 프로세스의 하위에만 영향을줍니다.
$TEST=hello
변수 확장이 비활성화되어 있거나 $TEST
이미 적절한 값을 가지고 있지 않는 한 어쨌든 작동하지 않을 것입니다 . hello
변수 에 할당 하려면 (note : no ) TEST
라고 말해야 합니다.TEST=hello
$
그 후 나는 그것을 내보내고 echo
다른 터미널 창에서 다시 시도했습니다 . 결과는 이전과 동일합니다.
다시 한 번, 이것은 예상 된 결과입니다.
그러나 로그인 (코드를 ~/.profile
파일에 추가)에서 동일한 코드를 실행하면 모든 터미널 창에서 변수를 사용할 수 있습니다.
터미널의 쉘이 환경 설정을 읽고이 설정 ~/.profile
을 상속 한 쉘의 자손이기 때문 입니다.