~/.bash_profile에서 PATH 설정과 PATH 내보내기

~/.bash_profile에서 PATH 설정과 PATH 내보내기

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

귀하의 질문에 구체적으로 답변하려면:

  1. export 하다명시적으로 설정합니다 $PATH.

  2. 아니요. export하위 프로세스에 대한 환경을 설정하지만 $PATH현재 환경에는 이미 설정되어 있습니다. 따라서 두 번째 예에서는 명령을 읽을 때 - 그리고~ 전에 export실행됨 - 현재 환경의 값이 단어 $PATH로 확장됩니다 $PATH.

  3. 귀하에게 필요하거나 편리한 것을 사용해야 합니다. 둘 다 기능적으로 아무런 차이가 없으므로 이는 주로 스타일의 문제입니다.

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대화형 쉘 프롬프트의 내용을 정의하는 쉘 변수를 사용하여 exported 변수의 변형이 하위 프로세스에 어떤 영향을 미치는지 보여줍니다.

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.profileexportexportexportunset

그러나 옵션을 포함하도록 내장 기능을 어느 정도 bash확장한 것은 주목할 만합니다 . 이를 통해 변수를 지정 하지 않고 변수에서 속성을 제거할 수 있지만 이는 이식 가능한 동작이 아닙니다.export-nexportunset

답변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

관련 정보