ProgramingTip

내보내기를 사용하거나 사용하지 않고 변수 정의

bestdevel 2020. 9. 28. 09:42
반응형

내보내기를 사용하거나 사용하지 않고 변수 정의


무엇입니까 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로 필요가있는 반면에 다른 사람들은 정반대라고합니다. 그것은 서브 쉘 사이의 차이에 유의 해야합니다 (에 의해 생성되는 사람들을 (), ``, $()또는 루프)와 서브 프로세스 (예를 들어,에 의해 호출 이름되는 프로세스 리터럴 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:

혼동의 원인이 한 가지 더 있습니다. 일부는 '포크 된'하위 프로세스가 내 보내지 않은 변수를 보지 않는 생각합니다. 일반적으로 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명령으로 대체 했으므로 해당 명령을 실행할 항목이 남아 있지 않으므로 이번에 줄이 -display되지 않습니다 .


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

이미 알고 있듯이 UNIX에서는 프로세스가 키 / 값 쌍인 환경 변수 집합을 가질 수 있으며 키와 값은 모두 문자열입니다. 운영 체제는 각 프로세스에 대해 이러한 쌍을 별도로 유지해야합니다.

프로그램은 다음 UNIX API를 통해 환경 변수에 액세스 할 수 있습니다.

  • char *getenv(const char *name);
  • int setenv(const char *name, const char *value, int override);
  • int unsetenv(const char *name);

프로세스는 또한 상위 프로세스에서 환경 변수를 상속합니다. 운영 체제는 자식 프로세스가 생성되는 순간 모든 "envars"의 복사본을 생성합니다.

Bash 는 다른 셸 중에서 사용자 요청에 따라 환경 변수를 설정할 수 있습니다. 이것이 export존재하는 것입니다.

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

Bash의 환경에 대한 추가 정보

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

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

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

또한 Bash 참조 설명서에 따르면 다음과 같이 주목할 가치가 있습니다.

간단한 명령 또는 기능에 대한 환경은 Shell Parameters에 설명 된대로 매개 변수 할당을 접두사로 지정하여 일시적으로 확장 할 수 있습니다 . 이러한 할당 명령문은 해당 명령이 표시하는 환경에만 영향을줍니다.


요약하자면 :

  • export운영 체제에서 환경 변수를 설정하는 데 사용됩니다. 이 변수는 이후 현재 Bash 프로세스에 의해 생성 된 모든 자식 프로세스에서 사용할 수 있습니다.
  • Bash 변수 표기법 (name = value)은 현재 Bash 프로세스에서만 사용할 수있는 지역 변수를 설정하는 데 사용됩니다.
  • 다른 명령을 접두사로하는 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 '...'에서 사용할 수 있습니다!

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


UNIX를 만든 두 사람인 Brian Kernighan과 Rob Pike는 저서 "The UNIX Programming Environment"에서이를 설명합니다. 제목은 Google이며 pdf 버전을 쉽게 찾을 수 있습니다.

3.6 절에서 셸 변수를 다루고 export해당 섹션 끝에서 명령 사용에 중점을 둡니다 .

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


내 보낸 변수가 환경 (env)에있는 것과 내 보내지 않은 변수가 환경에없는 것의 차이를 보여주기 위해 :

이렇게하면 :

$ MYNAME=Fred
$ export OURNAME=Jim

그러면 $ OURNAME 만 env에 나타납니다. $ MYNAME 변수가 환경에 없습니다.

$ env | grep NAME
OURNAME=Jim

하지만 $ MYNAME 변수가 쉘에 존재합니다.

$ echo $MYNAME
Fred

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


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

참고 URL : https://stackoverflow.com/questions/1158091/defining-a-variable-with-or-without-export

반응형