Bash 프로필을 사용자 정의할 때 차이점은 무엇이며 어떤 것이 더 좋습니까? 명령 에 대한 문서는 export
내장 cmd이므로 부족합니다.
내 ~/.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
. 또한 동일합니다.
그래서:
- 1) PATH를 명시적으로 설정하는 것과 사용하는 것의 이점은 무엇입니까
export
? - 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