"내보내기"명령의 용도는 무엇입니까?


12

한 터미널 창에서 환경 변수를 만들고 다른 터미널 창에서 환경 변수를 에코하려고했습니다. 그것은 아무것도 표시하지 않았습니다.

$TEST=hello

그 후 나는 그것을 내보내고 echo다른 터미널 창에서 다시 시도했습니다 . 결과는 이전과 동일합니다.

export TEST 

그러나 로그인 (코드를 ~/.profile파일에 추가)에서 동일한 코드를 실행하면 모든 터미널 창에서 변수를 사용할 수 있습니다. 여기서 무슨 일이 일어나고 있습니까? 터미널에서 코드를 실행하는 것과 로그인에서 동일한 코드를 실행하는 것의 차이점은 무엇입니까?

답변:


25

export자식 프로세스 환경에 포함될 변수를 만듭니다. 기존의 다른 환경에는 영향을 미치지 않습니다. 일반적으로 한 터미널에 변수를 설정하고 다른 터미널에 자동으로 표시하는 방법은 없으며 각 프로세스마다 환경이 설정됩니다.

이를 추가 .profile하면 로그인 할 때마다 새 변수를 포함하도록 환경이 설정됩니다. 따라서 한 셸에서 다른 셸로 내보내지는 않지만 초기 환경을 설정할 때 새 셸에 포함하도록 지시합니다.


1

각 프로세스에는 프로세스가 다른 프로세스와 개별적으로 독립적으로 설정할 수있는 몇 가지 속성이 있습니다. 자원 제한, umask, 현재 디렉토리, 환경 변수 등이 그 예입니다. 프로세스 작성시 ( fork()시스템 호출을 통해) 하위는이 속성을 상위에서 상속합니다. 이 후 자식 프로세스는 이러한 속성을 임의로 설정할 수 있습니다. (일부 제한 사항이 적용되면 프로세스가 하드 자원 제한을 늘리거나 현재 디렉토리를 실행 권한이없는 디렉토리로 변경할 수 없습니다.)

환경 변수를 수정하는 프로그램은 거의 없으며 귀찮게하지 않습니다. 후자의 경우를 가정 해 봅시다. 따라서 자식 프로세스가 더 많은 자식을 만들면이 프로세스는 조부모와 동일한 환경 변수를 갖습니다. 등등.

이제 쉘에는 볼 수있는 많은 변수가 있습니다 set(Bourne Shell 유형의 쉘에서는 C 쉘에 대해 dunno). 이러한 변수는 환경 변수가 아닌 한 환경 변수가 아닙니다 export. 환경 변수는로 볼 수 있습니다 env. 쉘 명령 행에서 프로그램을 시작하면 프로그램은 쉘에서 환경 변수를 상속합니다. 쉘 스크립트에서 시작된 프로그램도 마찬가지입니다.

따라서 로그인시 프로파일 데이터 (예 :)를 읽고 ~/.profile거의 모든 어린이, 손자 등에 게 상속 하는 쉘이 있습니다. 이것은 환경 변수 설정이 로그인 쉘 또는 로그인 스크립트에서 로그인 세션 내에서 시작된 다른 모든 프로그램으로 흘러가는 방식입니다.

한 터미널 창에서 환경 변수를 만들고 다른 터미널 창에서 환경 변수를 에코하려고했습니다. 그것은 아무것도 표시하지 않았습니다.

위의 설명에 따르면, 이것은 예상 된 결과입니다. 프로세스 환경의 변경은 기존 프로세스가 아니라 이후에 작성된이 프로세스의 하위에만 영향을줍니다.

$TEST=hello

변수 확장이 비활성화되어 있거나 $TEST이미 적절한 값을 가지고 있지 않는 한 어쨌든 작동하지 않을 것입니다 . hello변수 에 할당 하려면 (note : no ) TEST라고 말해야 합니다.TEST=hello$

그 후 나는 그것을 내보내고 echo다른 터미널 창에서 다시 시도했습니다 . 결과는 이전과 동일합니다.

다시 한 번, 이것은 예상 된 결과입니다.

그러나 로그인 (코드를 ~/.profile파일에 추가)에서 동일한 코드를 실행하면 모든 터미널 창에서 변수를 사용할 수 있습니다.

터미널의 쉘이 환경 설정을 읽고이 설정 ~/.profile을 상속 한 쉘의 자손이기 때문 입니다.

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