무엇입니까 export
?
차이점은 무엇입니까?
export name=value
과
name=value
답변
export
하위 프로세스에서 변수를 사용할 수있게합니다.
그건,
export name=value
해당 쉘 프로세스에서 실행 하는 모든 프로세스 에서 변수 이름을 사용할 수 있음을 의미합니다 . 프로세스가이 변수를 사용하도록하려면을 사용 export
하고 해당 쉘에서 프로세스를 실행하십시오.
name=value
변수 범위는 셸로 제한되며 다른 프로세스에서는 사용할 수 없습니다. 이것을 루프 변수, 임시 변수 등에 사용합니다.
변수를 내보내는 것이 부모 프로세스에서 사용할 수 없다는 점에 유의해야합니다. 즉, 생성 된 프로세스에서 변수를 지정하고 내보내더라도 변수를 시작한 프로세스에서 변수를 사용할 수 없습니다.
답변
다른 답변의 내용을 설명하려면 :
$ foo="Hello, World"
$ echo $foo
Hello, World
$ bar="Goodbye"
$ export foo
$ bash
bash-3.2$ echo $foo
Hello, World
bash-3.2$ echo $bar
bash-3.2$
답변
다른 사람들은 내보내기가 서브 쉘에서 변수를 사용할 수있게한다고 답했으며 이는 맞지만 부작용 일뿐입니다. 변수를 내 보내면 현재 셸 환경에 해당 변수가 저장됩니다 (예 : 셸 호출 putenv(3)
또는 setenv(3)
).
프로세스 환경은 exec에 상속되어 변수를 서브 쉘에 표시합니다.
편집 (5 년 관점) : 이것은 어리석은 대답입니다. ‘내보내기’의 목적은 변수가 “이후에 실행되는 명령 환경에 있도록”해당 명령이 서브 쉘이든 서브 프로세스이든 관계없이 만드는 것입니다. 순진한 구현은 단순히 변수를 쉘 환경에 두는 것이지만 구현하기가 불가능합니다 export -p
.
답변
서브 쉘을 생성 할 때 배쉬로 내보낼 필요는 없다고하는 반면 다른 사람들은 정반대라고 말했습니다. 그것은 서브 쉘 사이의 차이에 유의해야합니다 (에 의해 생성되는 사람들을 ()
, ``
, $()
또는 루프)와 서브 프로세스 (예를 들어, 이름에 의해 호출되는 프로세스 리터럴 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
명령으로 교체했기 때문에이 줄을 볼 수 없으므로 해당 명령을 실행할 수있는 항목이 없습니다.
답변
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
현재 쉘에서 분기 된 모든 쉘에서 변수를 사용할 수있게합니다.
답변
변수를 내보내고 나중에 값을 변경할 수 있습니다. 변수의 변경된 값은 하위 프로세스에서 사용 가능합니다. 변수에 대해 내보내기가 설정되면 export -n <var>
속성을 제거 해야합니다 .
$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset