2014-01-19 2 views
0

내 보낸 환경 변수와 환경 변수의 차이점은 무엇입니까?내 보낸 환경 변수 v 환경 변수

나는 질문에 응답해야 "우리가 터미널에 정의 된 모든 환경 변수를 표시 할 수 있습니까?"

먼저 나는 그것이 다시는 "터미널에 정의"고 말했다와 "하려면 printenv"했지만 생각 나는 이것이 "env"로 표시되어 읽은 환경 변수를 수출했다는 것을 의미한다고 생각했습니다.

저는 혼란 스럽습니다.

답변

1

export은 환경 변수를 만드는 명령입니다. "내 보낸 환경 변수"는 중복됩니다.

쉘에는 export 명령으로 생성되지 않은 환경 변수가있을 수 있습니다. 왜냐하면 모든 프로그램이 호출 프로그램에 의해 호출 된 환경에서 execve 시스템 호출을 통해 시작되기 때문에 일부 환경이 있다고 말할 수 있습니다. 결코 "수출"되지 않은 변수.

하지만 그건 어리석은 구별입니다. 쉘은 환경 변수의 기원을 추적하지 않습니다. 어느 것이 "터미널에 정의되어 있는지"알려주는 방법은 없습니다. 그것은 모릅니다. (history | grep export? Ugh ...)

Charles Goodwin의 대답에 대한 응답으로 유닉스에는 "지속적인"환경 변수가 없습니다. 영속 변수의 환영은 쉘 시작 파일 (/etc/profile, $HOME/.profile 등)에 정의를 넣음으로써 생성 될 수 있지만 그 정의는 수동으로 실행하는 export 명령과 구별 할 수없는 export 명령이됩니다.

일부 시스템에서는 /etc/environment 파일이 존재하기 때문에 "공유 된 영구적 인"환경 변수 세트가 훨씬 더 환상적으로 보이지만 실제로는 그렇지 않습니다. export 키워드는 쉘에서 구문 분석하지 않기 때문에 포함되어 있지 않습니다. PAM은 쉘을 시작하기 전에이를 처리합니다. 그것은 /etc/profile과 같은 원리입니다 - 로그인 할 때마다 파일이 초기 프로세스 환경으로 읽혀 져야합니다. 변수에 대해 "다른 프로세스 수정 및 체크인"시도를 통해 값이 공유되지 않음을 알 수 있습니다/etc/environment에서 가져온 파일 또는 심지어 /etc/environment 파일을 수정하고 이미 존재하는 프로세스에 대한 영향을 확인하십시오. 아무 것도 없을 것입니다.

환경을 "유전 변수"라고 부를 수 있습니다. 정보는 부모에서 자식으로 한 방향으로 만 전달됩니다. 용어를 변경하기에는 너무 늦었습니다.

0

운영체제에 따라 다를 수 있지만 내 보낸 변수는 해당 세션에만 해당됩니다 (예 : 터미널 열기, 환경 변수 내보내기, 다른 터미널 열기 및 내 보낸 env가 새 터미널에서 설정되지 않음). 영구 (세션 간, 재부팅 등).

다른 유형의 env가 응용 프로그램에 적용되는 방법에 대해서는 전혀 알지 못했습니다 (내 보낸 env를 적용한 다음 응용 프로그램을 실행하기 전에 내보내기해야하는 경우는 예외).