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

무엇입니까 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