2012-09-24 2 views

답변

14

모든 과정은, 심지어 윈도우에서 환경 블록로 알려진 메모리 블록을 가지고,이 환경 변수이 포함되어 있습니다. 새로운 프로세스가 생성되면 기본적으로 부모 프로세스의 환경 블록이 자식 프로세스에 복사되므로 환경 변수는 텍스트 데이터를 자식 프로세스로 전달하는 간단한 방법입니다.

export 명령은 환경 변수를 작성하거나 일반 지역 변수를 환경 변수로 변환합니다. C 쉘에서 사용되는 몇 가지 기능 중 하나는 환경 변수 (setenv)와 로컬 변수 (set)에 대해 다른 구문을 사용한다는 것입니다. Bash와 Korn 쉘과 같은 Bourne 쉘 유도체는 모든 것을 숨 깁니다.

현재 단순한 값만 전달 될 수 있으므로 배열과 같은 항목은 지원되지 않습니다 (첫 번째 요소 만 내보냄). define을 사용하여 설정된 변수 속성은 하위 프로세스가 동일한 유형의 쉘, 즉 bash의 다른 인스턴스가 아닌 경우에도 반출되지 않습니다. 이는 내 보낸 함수에도 적용되지만, 때로는 다른 유형의 쉘 (eval 사용) 사이에서 해킹 할 수 있습니다.

Bash (와 다른 사람들)에서는 모든 변수가 환경 변수라는 것을 의미하는 allexport이라는 쉘 설정이 있습니다. 일반적으로 일반적으로 나쁜 생각 일 수 있습니다.execve을 사용하여 C와 같은 다른 환경 블록을 제공 할 수 있지만 쉘에서 env과 같은 프로그램이 필요한 경우 자세한 내용은 man env을 참조하십시오.

34

export은 하위 프로세스에서 변수를 사용할 수있게합니다.

즉, 스크립트에서 새 프로세스를 생성하는 경우 export이 아닌 한 변수 k을 해당 하위 프로세스에서 사용할 수 없습니다. 서브 프로세스에서이 변수를 변경하면 은 부모 프로세스에서이 표시되지 않습니다.

자세한 내용은 this doc의 3.2.3 섹션을 참조하십시오.

+0

간결한 점. +1 –

18

나는 차이를 보여주기 위해 간단한 스크립트를 만들었습니다 : 값이 알려진

$ cat script.sh 
echo $answer 

하자 시험

$ answer=42 
$ ./script.sh 

$ . script.sh 
42 

export없이 만 스크립트를 실행하기 위해 같은 공정을 사용하는 경우 (즉, bash 인스턴스, source/.을 사용)

export를 사용하기

:

$ export answer=42 
$ ./script.sh 
42 
$ . script.sh 
42 

값은 구성 프로세스에 공지되어있다.

따라서 하위 프로세스가 변수 값을 알고 싶다면 export을 사용해야합니다.