내보내기 유무에 관계없이 변수 정의


955

무엇입니까 export?

차이점은 무엇입니까?

export name=value

name=value

4
접선으로도 export name=value이식성이 없다는 점에 유의하십시오 . 정확히 원하는 것에 따라 name=value; export name휴대용 솔루션을 사용해보십시오 .
tripleee

답변:


1054

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

그건,

export name=value

해당 쉘 프로세스에서 실행 하는 모든 프로세스 에서 변수 이름을 사용할 수 있음을 의미합니다 . 프로세스가이 변수를 사용하도록하려면을 사용 export하고 해당 쉘에서 프로세스를 실행하십시오.

name=value

변수 범위는 셸로 제한되며 다른 프로세스에서는 사용할 수 없습니다. 이것을 루프 변수, 임시 변수 등에 사용합니다.

변수를 내보내는 것이 부모 프로세스에서 사용할 수 없다는 점에 유의해야합니다. 즉, 생성 된 프로세스에서 변수를 지정하고 내보내더라도 변수를 시작한 프로세스에서 변수를 사용할 수 없습니다.


105
특히 내보내기는 환경을 통해 자식 프로세스에서 변수를 사용할 수있게합니다.
Beano

15
또한 내보내기가 "소스"(예 :. filename) 파일에 있으면 작업 환경으로도 내보내는 것으로 추가됩니다.
rogerdpack

6
@rogerdpack 수출하지 않고는 할 수 없습니까? 고양이> blah \ na = hi \ n. blah; 에코 $ a; 나를 위해 'hi'를 출력합니다.
David Winiecki

2
수출하지 않아도 작동합니다. 따라서 파일을 소싱 할 때 내보내기를 사용하면 하위 프로세스에 반영되며 로컬 bash 환경에만 영향을 미치지 않으면 하위 프로세스에 반영됩니다 ...
rogerdpack

19
여기에는 하나의 엣지 케이스가 있습니다. name=value command 않는 하위 과정에서 변수를 사용할 수 있도록 command.
Oliver Charlesworth

254

다른 답변의 내용을 설명하려면 :

$ 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$ 

9
이에 대한 또 다른 예al$ foobar="Whatever" bash
Alun

70

다른 사람들은 내보내기가 서브 쉘에서 변수를 사용할 수있게한다고 답했으며 이는 맞지만 부작용 일뿐입니다. 변수를 내 보내면 현재 셸 환경에 해당 변수가 저장됩니다 (예 : 셸 호출 putenv(3)또는 setenv(3)).
프로세스 환경은 exec에 상속되어 변수를 서브 쉘에 표시합니다.

편집 (5 년 관점) : 이것은 어리석은 대답입니다. '내보내기'의 목적은 변수가 "이후에 실행되는 명령 환경에 있도록"해당 명령이 서브 쉘이든 서브 프로세스이든 관계없이 만드는 것입니다. 순진한 구현은 단순히 변수를 쉘 환경에 두는 것이지만 구현하기가 불가능합니다 export -p.


6
이것은 사실이 아닙니다. 에서가 bash, 수출은 참으로 현재 쉘의 환경 변수를 추가 않지만이의 경우되지 않습니다 dash. 현재 쉘의 환경에 변수를 추가하는 것이의 의미를 구현하는 가장 간단한 방법 export이지만 동작은 필수가 아닙니다.
윌리엄 퍼셀

7
나는 dash이것과 무슨 관련 이 있는지 잘 모르겠습니다 . 원래 포스터는에 대해 구체적으로 묻고있었습니다 bash.
불가사리

14
질문은 태그가 지정 bash되었지만 모든 bourne-shell 변형에 동일하게 적용됩니다. 지나치게 구체적이고 적용되는 답변을 제공하는 것은 bash큰 악입니다.
William Pursell

12
bash쉘의 jQuery입니다.
Potherca

2
export makes the variable available to subshells, and that is correct이것은 용어를 매우 혼란스럽게 사용합니다. 서브 쉘은 export변수를 상속 할 필요가 없습니다 . 서브 프로세스
Amit Naidu

62

서브 쉘을 생성 할 때 배쉬로 내보낼 필요는 없다고하는 반면 다른 사람들은 정반대라고 말했습니다. 그것은 서브 쉘 사이의 차이에 유의해야합니다 (에 의해 생성되는 사람들을 (), ``, $()또는 루프)와 서브 프로세스 (예를 들어, 이름에 의해 호출되는 프로세스 리터럴 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명령으로 교체했기 때문에이 줄을 볼 수 없으므로 해당 명령을 실행할 수있는 항목이 없습니다.


나는 자체적으로 서브 쉘을 생성 한 루프를 본 적이 없다. 파이프 라인이하는 OTOH (항상 마지막 이외의 조각, 때로는 쉘, 버전 및 옵션에 따라 마지막 조각). 배경 ( &)도 서브 쉘을 작성합니다.
dave_thompson_085

어떤 이들에 대해 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.
4xy

31

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에게 감사합니다.


12

export 현재 쉘에서 분기 된 모든 쉘에서 변수를 사용할 수있게합니다.


11

변수를 내보내고 나중에 값을 변경할 수 있습니다. 변수의 변경된 값은 하위 프로세스에서 사용 가능합니다. 변수에 대해 내보내기가 설정되면 export -n <var>속성을 제거 해야합니다 .

$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset

고마워, 이것은 환경 변수를 사용한 스크립트를 보았고 새로운 값으로 "재수출"한 스크립트를 보았 기 때문에 내가 찾던 정보입니다. 필요한지 궁금했습니다.
Mike Lippert 2016 년

8

이미 알고 있듯이 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존재하는 것입니다.

exportBash에 대한 환경 변수를 설정하는 Bash 명령입니다. 이 명령으로 설정된 모든 변수는이 Bash가 생성 한 모든 프로세스에 의해 상속됩니다.

Bash 환경에 대한 추가 정보

Bash의 또 다른 종류의 변수는 내부 변수입니다. Bash는 대화식 쉘이 아니기 때문에 실제로 다른 인터프리터 (예 : Python)와 마찬가지로 스크립트 인터프리터이므로 자체 변수 세트를 유지할 수 있습니다. Bash (Python과 달리)는 문자열 변수 만 지원한다는 점을 언급해야합니다.

Bash 변수를 정의하는 표기법은 name=value입니다. 이러한 변수는 Bash 내부에 있으며 운영 체제가 유지하는 환경 변수와 관련이 없습니다.

쉘 매개 변수 에 대한 추가 정보 (변수 포함)

또한 Bash 참조 매뉴얼에 따르면 다음과 같이 주목할 가치가 있습니다.

쉘 매개 변수에 설명 된대로 간단한 명령 또는 기능의 환경은 매개 변수 지정으로 접 두부로 임시로 기능을 보강 할 수 있습니다 . 이러한 할당 문은 해당 명령으로 보이는 환경에만 영향을줍니다.


요약하면 다음과 같습니다.

  • export운영 체제에서 환경 변수를 설정하는 데 사용됩니다. 이 변수는 현재 Bash 프로세스에 의해 생성 된 모든 자식 프로세스에서 사용할 수 있습니다.
  • bash 변수 표기법 (name = value)은 현재 bash 프로세스에만 사용 가능한 로컬 변수를 설정하는 데 사용됩니다.
  • 다른 명령을 접두사로 사용하는 배시 변수 표기법은 해당 명령의 범위에 대해서만 환경 변수를 만듭니다.

1
bash vars는 Python만큼 많은 유형을 지원하지 않지만 문자열, 정수 및 두 종류의 배열 (awk 배열, perl hash 또는 Python dict와 유사한 'indexed'/ traditional 및 'associative')을 가지고 있습니다. 다른 껍질은 다양합니다. 문자열 만 이식 가능 합니다.
dave_thompson_085

7

허용 대답 이 의미,하지만 난 쉘 내장 명령에 명시 적으로 연결을하고 싶습니다 :

이미 언급했듯이 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

3

또 다른 예는 다음과 같습니다.

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 '...'에서 사용할 수 있습니다!

추가 예는 다음을 참조하십시오.


3

유닉스 제작자 인 Brian Kernighan과 Rob Pike는 자신의 저서 "The UNIX Programming Environment"에서 이것을 설명합니다. 제목에 대한 Google과 쉽게 PDF 버전을 찾을 수 있습니다.

그것들은 3.6 절의 쉘 변수를 다루고 export그 절의 끝에서 명령 사용에 중점을 둡니다 .

하위 쉘에서 변수 값에 액세스 할 수있게하려면 쉘의 내보내기 명령을 사용해야합니다. (서브 쉘에서 부모로 변수의 값을 익스포트 할 방법이없는 이유에 대해 생각할 수도 있습니다).


2

환경에 내 보낸 변수 (env)와 환경에 있지 않은 비내 보낸 변수의 차이점을 표시하려면 다음을 수행하십시오.

내가 이렇게하면 :

$ MYNAME=Fred
$ export OURNAME=Jim

env에 $ OURNAME 만 나타납니다. 변수 $ MYNAME이 env에 없습니다.

$ env | grep NAME
OURNAME=Jim

그러나 $ MYNAME 변수가 쉘에 존재합니다.

$ echo $MYNAME
Fred

1

기본적으로 스크립트 내에서 작성된 변수는 현재 쉘에서만 사용 가능합니다. 자식 프로세스 (서브 쉘)는 설정되거나 수정 된 값에 액세스 할 수 없습니다. 자식 프로세스가 값을 볼 수있게하려면 export 명령을 사용해야합니다.


0

논의에서 명시 적으로 언급되지 않았지만 모든 변수가 하위 프로세스에 복사되므로 bash 내부에서 서브 쉘을 생성 할 때 내보내기를 사용할 필요는 없습니다.


당신이 말하는 것이 위의 예제와 답변과 직접 모순되는 것처럼 설명하십시오.
마이크 Lippert

변수를 전체적으로 내 보내지 않고 하위 프로세스에서만 사용할 수있는 경우 올바른 방법입니다! 감사합니다.
jtblin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.