답변:
export
하위 프로세스에서 변수를 사용할 수있게합니다.
그건,
export name=value
해당 쉘 프로세스에서 실행 하는 모든 프로세스 에서 변수 이름을 사용할 수 있음을 의미합니다 . 프로세스가이 변수를 사용하도록하려면을 사용 export
하고 해당 쉘에서 프로세스를 실행하십시오.
name=value
변수 범위는 셸로 제한되며 다른 프로세스에서는 사용할 수 없습니다. 이것을 루프 변수, 임시 변수 등에 사용합니다.
변수를 내보내는 것이 부모 프로세스에서 사용할 수 없다는 점에 유의해야합니다. 즉, 생성 된 프로세스에서 변수를 지정하고 내보내더라도 변수를 시작한 프로세스에서 변수를 사용할 수 없습니다.
name=value command
않는 하위 과정에서 변수를 사용할 수 있도록 command
.
다른 사람들은 내보내기가 서브 쉘에서 변수를 사용할 수있게한다고 답했으며 이는 맞지만 부작용 일뿐입니다. 변수를 내 보내면 현재 셸 환경에 해당 변수가 저장됩니다 (예 : 셸 호출 putenv(3)
또는 setenv(3)
).
프로세스 환경은 exec에 상속되어 변수를 서브 쉘에 표시합니다.
편집 (5 년 관점) : 이것은 어리석은 대답입니다. '내보내기'의 목적은 변수가 "이후에 실행되는 명령 환경에 있도록"해당 명령이 서브 쉘이든 서브 프로세스이든 관계없이 만드는 것입니다. 순진한 구현은 단순히 변수를 쉘 환경에 두는 것이지만 구현하기가 불가능합니다 export -p
.
bash
, 수출은 참으로 현재 쉘의 환경 변수를 추가 않지만이의 경우되지 않습니다 dash
. 현재 쉘의 환경에 변수를 추가하는 것이의 의미를 구현하는 가장 간단한 방법 export
이지만 동작은 필수가 아닙니다.
dash
이것과 무슨 관련 이 있는지 잘 모르겠습니다 . 원래 포스터는에 대해 구체적으로 묻고있었습니다 bash
.
bash
되었지만 모든 bourne-shell 변형에 동일하게 적용됩니다. 지나치게 구체적이고 적용되는 답변을 제공하는 것은 bash
큰 악입니다.
bash
쉘의 jQuery입니다.
export makes the variable available to subshells, and that is correct
이것은 용어를 매우 혼란스럽게 사용합니다. 서브 쉘은 export
변수를 상속 할 필요가 없습니다 . 서브 프로세스
서브 쉘을 생성 할 때 배쉬로 내보낼 필요는 없다고하는 반면 다른 사람들은 정반대라고 말했습니다. 그것은 서브 쉘 사이의 차이에 유의해야합니다 (에 의해 생성되는 사람들을 ()
, ``
, $()
또는 루프)와 서브 프로세스 (예를 들어, 이름에 의해 호출되는 프로세스 리터럴 bash
스크립트에서 나타나는).
이 두 구성에서 공통적 인 것은 둘 다 변수를 상위 셸로 다시 전달할 수 없다는 것입니다.
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
혼동의 원인이 하나 더 있습니다. 일부는 '포크 (forked)'서브 프로세스가 익스포트되지 않은 변수를 볼 수없는 서브 프로세스라고 생각합니다. 일반적으로 fork () 다음에 exec ()가옵니다. 그래서 fork ()가 찾는 것처럼 보이지만 실제로는 exec ()입니다. 명령으로 fork ()하지 않고 명령을 실행할 수 exec
있으며이 메소드로 시작한 프로세스는 내 보내지 않은 변수에도 액세스 할 수 없습니다.
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export
parent:
이번에는 부모 셸을 exec
명령으로 교체했기 때문에이 줄을 볼 수 없으므로 해당 명령을 실행할 수있는 항목이 없습니다.
&
)도 서브 쉘을 작성합니다.
var=asdf bash -c 'echo $var'
나 var=asdf exec bash -c 'echo $var'
? 출력은 asdf
입니다. 는 ;
변수 정의 뒤에 위치하는 경우의 차이를 만든다. 설명은 무엇입니까? 그것은처럼 보이는 var
(아니오 ;
원산지 쉘에 그것과는 상관이 없다 때문에, 어떻게 든 양산 서브 프로세스에 관해서). echo $var
두 번째 줄에서 실행되면 아무것도 인쇄하지 않습니다. 그러나 하나의 줄 var=asdf bash -c 'echo $var'; echo $var
은 제공합니다 asdf\nasdf
.
export NAME=value
하위 프로세스에 의미가있는 설정 및 변수
NAME=value
현재 쉘 프로세스에 전용 인 임시 또는 루프 변수의 경우
보다 상세하게, export
작성시 서브 프로세스 및 해당 서브 프로세스에 복사하는 환경에서 변수 이름을 표시합니다. 하위 프로세스에서 이름이나 값이 다시 복사되지 않습니다.
일반적인 오류는 등호 주위에 공백을 두는 것입니다.
$ export FOO = "bar"
bash: export: `=': not a valid identifier
B
서브 프로세스는 내 보낸 변수 ( ) 만 볼 수 있습니다.
$ A="Alice"; export B="Bob"; echo "echo A is \$A. B is \$B" | bash
A is . B is Bob
서브 프로세스의 변경 사항은 기본 쉘을 변경하지 않습니다.
$ export B="Bob"; echo 'B="Banana"' | bash; echo $B
Bob
내보내기로 표시된 변수에는 하위 프로세스가 작성 될 때 값이 복사됩니다.
$ export B="Bob"; echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash &
[1] 3306
$ B="Banana"; echo '(sleep 30; echo "Subprocess 2 has B=$B")' | bash
Subprocess 1 has B=Bob
Subprocess 2 has B=Banana
[1]+ Done echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash
내 보낸 변수 만 환경의 일부가됩니다 ( man environ
) :
$ ALICE="Alice"; export BOB="Bob"; env | grep "ALICE\|BOB"
BOB=Bob
이제 여름의 태양만큼이나 분명해야합니다! Brain Agnew, alexp 및 William Prusell에게 감사합니다.
변수를 내보내고 나중에 값을 변경할 수 있습니다. 변수의 변경된 값은 하위 프로세스에서 사용 가능합니다. 변수에 대해 내보내기가 설정되면 export -n <var>
속성을 제거 해야합니다 .
$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset
이미 알고 있듯이 UNIX는 프로세스가 키와 값이 문자열 인 키 / 값 쌍인 환경 변수 세트를 갖도록 허용합니다. 운영 체제는 각 프로세스마다 이러한 쌍을 별도로 유지해야합니다.
프로그램은 다음 UNIX API를 통해 환경 변수에 액세스 할 수 있습니다.
char *getenv(const char *name);
int setenv(const char *name, const char *value, int override);
int unsetenv(const char *name);
프로세스는 또한 상위 프로세스에서 환경 변수를 상속합니다. 운영 체제는 자식 프로세스가 생성되는 순간 모든 "Envar"의 복사본을 생성합니다.
Bash 는 다른 쉘 중에서도 사용자 요청에 따라 환경 변수를 설정할 수 있습니다. 이것이 export
존재하는 것입니다.
export
Bash에 대한 환경 변수를 설정하는 Bash 명령입니다. 이 명령으로 설정된 모든 변수는이 Bash가 생성 한 모든 프로세스에 의해 상속됩니다.
Bash 환경에 대한 추가 정보
Bash의 또 다른 종류의 변수는 내부 변수입니다. Bash는 대화식 쉘이 아니기 때문에 실제로 다른 인터프리터 (예 : Python)와 마찬가지로 스크립트 인터프리터이므로 자체 변수 세트를 유지할 수 있습니다. Bash (Python과 달리)는 문자열 변수 만 지원한다는 점을 언급해야합니다.
Bash 변수를 정의하는 표기법은 name=value
입니다. 이러한 변수는 Bash 내부에 있으며 운영 체제가 유지하는 환경 변수와 관련이 없습니다.
쉘 매개 변수 에 대한 추가 정보 (변수 포함)
또한 Bash 참조 매뉴얼에 따르면 다음과 같이 주목할 가치가 있습니다.
쉘 매개 변수에 설명 된대로 간단한 명령 또는 기능의 환경은 매개 변수 지정으로 접 두부로 임시로 기능을 보강 할 수 있습니다 . 이러한 할당 문은 해당 명령으로 보이는 환경에만 영향을줍니다.
요약하면 다음과 같습니다.
export
운영 체제에서 환경 변수를 설정하는 데 사용됩니다. 이 변수는 현재 Bash 프로세스에 의해 생성 된 모든 자식 프로세스에서 사용할 수 있습니다.허용 대답 이 의미,하지만 난 쉘 내장 명령에 명시 적으로 연결을하고 싶습니다 :
이미 언급했듯이 export
셸과 자식 모두에 변수를 사용할 수 있습니다. 경우 export
되어 있지 사용, 변수는 쉘에서 사용할 수, 오직 쉘 내장 명령은 액세스 할 수 있습니다.
그건,
tango=3
env | grep tango # prints nothing, since env is a child process
set | grep tango # prints tango=3 - "type set" shows `set` is a shell builtin
또 다른 예는 다음과 같습니다.
VARTEST="value of VARTEST"
#export VARTEST="value of VARTEST"
sudo env | grep -i vartest
sudo echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"
sudo bash -c 'echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"'
export VARTEST를 사용해야 만 VARTEST의 값을 sudo bash -c '...'에서 사용할 수 있습니다!
추가 예는 다음을 참조하십시오.
bash-hackers.org/wiki/doku.php/scripting/processtree
논의에서 명시 적으로 언급되지 않았지만 모든 변수가 하위 프로세스에 복사되므로 bash 내부에서 서브 쉘을 생성 할 때 내보내기를 사용할 필요는 없습니다.
export name=value
이식성이 없다는 점에 유의하십시오 . 정확히 원하는 것에 따라name=value; export name
휴대용 솔루션을 사용해보십시오 .