Bash 구성 파일을 사용자 정의할 때 차이점은 무엇이며 어느 것이 더 좋습니까? 이 명령 export
은 내장 명령이므로 이에 대한 문서가 거의 없습니다.
내 ~/.bash_profile 버전 1에서 발췌:
#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
출력:echo $PATH
/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin
버전 2에서 발췌:
#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
출력은 echo $PATH
버전 1과 동일합니다. env
그것도 마찬가지다.
그래서:
export
1) PATH를 명시적으로 설정하는 것과 비교하여 PATH를 사용하면 어떤 이점이 있습니까?- 2) 버전 1과 버전 2의 애플리케이션에 기능적 차이가 있나요?
- 3) 어느 것을 사용해야 하며 그 이유는 무엇입니까?
답변1
귀하의 질문에 구체적으로 답변하려면 다음을 수행하십시오.
export
하다명시적으로 설정됩니다$PATH
.아니요.
export
하위 프로세스에 대한 환경을 설정하지만$PATH
현재 환경에 대해서는 이미 설정되어 있습니다. 따라서 두 번째 예에서는 명령을 - 및앞으로export
실행됨 - 현재 환경의 값이 단어$PATH
로 확장됩니다$PATH
.필요하거나 편안하다고 생각되는 것을 사용해야 합니다. 둘 사이에는 기능적 차이가 없으므로 대부분 스타일의 문제입니다.
POSIX는 정의합니다export
내장그래서:
쉘은
export
지정된 이름에 해당하는 변수에 속성을 할당해야 하며, 이는 이후에 실행되는 명령의 컨텍스트에 해당 속성을 배치합니다. 변수명이 뒤에 오는 경우= 단어이면 이 변수의 값을 다음으로 설정해야 합니다.단어.
나한테서 또 하나답변:
쉘 변수 선언과 환경 변수 선언에는 차이가 없습니다. 내보내기는 내장 함수이므로 다음 호출 프로세스에 대한 환경 변수를 선언하지만 프로세스를 호출하지 않으면 프로세스는 여전히 셸이므로 변수가 두 번 평가됩니다.
이중 평가를 사용하지 않는 한 export
내보낸 변수에 영향을 주지 않고 모든 내보내기를 제거할 수 있습니다. 두 가지 평가란 다음을 의미합니다.
var1=var2
export "${var1}=var3"
echo "$var2"
var3
대신 다음을 사용하세요.
set -a
...스크립트 상단에 있습니다. 이후에 정의된 모든 변수는 자동으로 적용됩니다 . 여기에는 이전에 편집하지 않은 변수도 exported
포함됩니다 . export
또는 set -a
스크립트의 일부를 사용하여 set +a
설정을 해제할 수도 있습니다. 이는 함수로도 작동합니다.
그러나 서브쉘은 어쨌든 변수 값을 자동으로 상속하므로 다음과 같습니다.
var1=value
( echo "$(echo "$var1")" )
value
export
이 경우에는 차이가 없습니다.
그러나 스크립트가 편집한 값을 해석하는 다른 스크립트나 다른 실행 파일을 호출 export
하고 해당 호출을 중지하면 export
해당 환경에서 해당 값을 더 이상 사용할 수 없습니다. 다음 예에서는 $PS1
대화형 쉘 프롬프트의 내용을 정의하는 쉘 변수를 사용하여 export
ed 변수에 대한 변경 사항이 하위 프로세스에 어떤 영향을 미치는지 보여줍니다.
export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
this is another executable
> exit
exit
하지만...
PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
sh-4.3$ exit
exit
하지만 프로세스를 호출할 때 명시적으로 환경 변수를 선언하면...
PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}
###OUTPUT###
this is another executable
> exit
exit
sh-4.3$ exit
exit
ENV
쉘(예: .bashrc
또는 ) 에서 처음 호출되는 모든 파일은 .profile
해당 쉘의 수명에 대한 변수 값을 설정합니다. 따라서 export
이러한 파일에서 설정되고 편집된 모든 변수는 해당 export
특성을 유지하며 export
쉘의 수명 동안 또는 호출될 때까지 해당 쉘에서 호출하는 모든 하위 프로세스에서 사용됩니다 unset
.
그러나 옵션을 포함하도록 내장 함수를 어느 정도 bash
확장 했다는 점은 주목할 가치가 있습니다. 이를 통해 변수를 수정 하지 않고 변수에서 속성을 제거 할 수 있지만 이식 가능한 동작은 아닙니다.export
-n
export
unset
답변2
짧은 답변:
https://superuser.com/a/153378/333431
내보낸 변수는 하위 프로세스에 전달되지만 내보내지 않은 변수는 전달되지 않습니다.
즉 export
, 서브셸에서 변수를 사용하려면 변수를 사용해야 합니다.
이것을 테스트할 수 있습니다:
$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here