PATH에 경로를 올바르게 추가하는 방법은 무엇입니까?

PATH에 경로를 올바르게 추가하는 방법은 무엇입니까?

PATH환경변수에 새로운 경로를 추가 해야 한다는 것을 알고 싶습니다 . 예를 들어 편집기를 통해 이 작업을 수행할 수 있다는 것을 알고 있지만 .bashrc수행 방법은 명확하지 않습니다.

이 방법:

export PATH=~/opt/bin:$PATH

아니면 이거?

export PATH=$PATH:~/opt/bin

답변1

뭔가 간단한 것

PATH=$PATH:~/opt/bin

또는

PATH=~/opt/bin:$PATH

~/opt/bin끝에 추가 할지(같은 이름의 프로그램이 여러 디렉터리에 있는 경우 다른 모든 디렉터리 이후에 검색) 또는 처음에 추가할지(다른 모든 디렉터리보다 먼저 검색)에 따라 다릅니다 .

동시에 여러 항목을 추가할 수 있습니다. PATH=$PATH:~/opt/bin:~/opt/node/bin아니면 변형을 주문하는 것도 좋을 것입니다. export추가 복잡도를 초래하므로 줄 시작 부분 에 넣지 마십시오 (아래 "bash 이외의 쉘에 대한 참고 사항" 참조).

프로젝트가 다양한 구성 요소로 구성된 경우 PATH중복된 항목이 생길 수 있습니다. 바라보다어떤 Unix 명령으로 발견된 홈 디렉터리 경로를 추가하는 방법은 무엇입니까?그리고awk 명령을 사용하여 중복된 $PATH 항목 제거중복 항목을 추가하거나 제거하지 않으려면

~/bin그런데 일부 배포판에서는 이를 PATH에 자동으로 넣습니다.

어디에 둘까

수정하려는 라인을 PATH, ~/.profile또는 ~/.bash_profile또는 에 배치합니다(있는 경우). (로그인 쉘이 bash가 아닌 zsh인 경우 에 넣으십시오 ~/.zprofile.)

구성 파일은 로그인 셸에서 읽혀지므로 다음에 로그인할 때만 적용됩니다. (일부 시스템에서는 로그인 쉘을 읽도록 터미널을 구성합니다. 이 경우 새 터미널 창을 시작할 수 있지만 설정이 적용됩니다.) 터미널을 통해 실행된 프로그램에만 적용되며, PATH모든 프로그램을 설정하는 방법은 시스템에 따라 다릅니다. )

~/.bash_rc어떤 프로그램도 이것을 읽지 않는다는 점에 유의하십시오 . 이는 ~/.bashrcbash의 대화형 인스턴스에 대한 구성 파일입니다. ~/.bashrc환경 변수를 정의하는 올바른 위치는 정의해서는 안되는 경우 입니다 PATH( ~/.profile또는 ~/.bash_profilebash 이외의 쉘에 관심이 없는 경우). 바라보다이들 간의 차이점은 무엇이며 어느 것을 사용해야 합니까?

/etc/environment또는에 넣지 마십시오 . 이것은 쉘 파일이 아니므 로 대체를 사용할 ~/.pam_environment수 없습니다 . $PATH이러한 파일에서는 변수를 덮어쓸 수만 있고 추가할 수는 없습니다.

일부 시스템 스크립트의 잠재적인 복잡성

변수가 이미 환경에 있는 경우에는 필요하지 않습니다 export. 변수 값에 대한 모든 변경 사항이 환경에 반영됩니다. PATH거의 항상 환경에서 모든 UNIX 시스템은 이를 초기에 설정합니다(사실 일반적으로 첫 번째 프로세스에서).

PATH로그인 시 이미 환경에 있고 포함되어 있는 일부 시스템 디렉터리를 사용할 수 있습니다 . 일종의 가상 환경을 설정할 때 미리 실행될 수 있는 스크립트를 작성하는 경우 스크립트가 PATH비어 있지 않고 내보내졌는지 확인하고 싶을 수 있습니다. PATH아직 설정되지 않은 경우 다음과 같습니다 PATH=$PATH:/some/directory. PATH로 설정합니다 :/some/directory. 시작 부분의 빈 구성 요소는 현재 디렉터리( like .:/some/directory)를 나타냅니다.

if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi

Bash 이외의 쉘에 대한 참고 사항

bash, ksh 및 zsh에서는 export구문이 특별하며 둘 다 올바른 작업을 PATH=~/opt/bin:$PATH수행합니다 . 대시( 많은 시스템 export PATH=~/opt/bin:$PATH에서)와 같은 다른 Bourne/POSIX 스타일 셸에서는 일반 명령으로 구문 분석되는데 이는 두 가지 차이점을 의미합니다./bin/shexport

따라서 대시와 같은 셸에서는 리터럴 문자열과 첫 번째 공백까지의 값으로 export PATH=~/opt/bin:$PATH설정 됩니다 . (맨손으로 일함)PATH~/opt/bin/:PATHPATH=~/opt/bin:$PATH견적이 필요하지 않습니다.그리고 옳은 일을 하세요. 를 작성 하거나 export이식 가능한 스크립트에서 사용하려는 경우 (또는 물결표 확장을 허용하지 않고 수행하는 Bourne 쉘로 의 이식성을 위해 ) 필요합니다.export PATH="$HOME/opt/bin:$PATH"PATH=~/opt/bin:$PATH; export PATHPATH=$HOME/opt/bin:$PATH; export PATHexport var=value

1 Bourne 쉘에서는 그렇지 않았지만(현대 POSIX 스타일 쉘이 아닌 실제 Bourne 쉘에서처럼) 요즘에는 이 오래된 쉘을 접할 가능성이 적습니다.

답변2

추가/앞 추가에 대한 방탄 접근 방식

일반적인 추가/접두사 방법

PATH="$PATH:~/opt/bin"   # appending
PATH="~/opt/bin:$PATH"   # prepending

심한 두통을 유발할 수 있습니다.

이것방탄 방식~/opt/binPATH 환경 변수에 경로(예: )를 추가합니다.

PATH="${PATH:+${PATH}:}~/opt/bin"   # appending
PATH="~/opt/bin${PATH:+:${PATH}}"   # prepending

왜?

$PATH이렇게 하면 처음에 비어 있을 때 원치 않는 부작용이 발생할 수 있는 가짜 선행/후행 콜론을 방지할 수 있습니다.악몽이 될 수도 있어, 찾기가 어렵습니다(이 답변이 사건을 간단히 처리하세요 awk).

설명하다(에서쉘 매개변수 확장):

${parameter:+word}

null이거나 설정되지 않은 경우 아무것도 대체되지 않으며, 그렇지 않으면 parameter확장이 대체됩니다.word

따라서 ${PATH:+${PATH}:}다음과 같이 확장됩니다.

  1. 비어 있거나 설정되지 않은 경우 아무것도 없습니다 PATH.
  2. ${PATH}:, PATH설정된 경우.

노트: 이것은 bash용입니다.


왜 시스템 스크립트가 일반적으로 사용하지 않는지 궁금합니다. 편집하다:저는 이와 같은 스크립트가 devtoolset-6/enable실제로 이것을 사용한다는 것을 방금 발견했습니다.

$ cat /opt/rh/devtoolset-6/enable
# General environment variables
export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}}
...

답변3

어느 쪽이든 작동하지만 동일한 작업을 수행하지는 않습니다. 즉, 요소는 PATH왼쪽에서 오른쪽으로 확인됩니다. 첫 번째 예에서는 의 실행 ~/opt/bin파일이 설치된 실행 파일(예: /usr/bin원하는 것일 수도 있고 아닐 수도 있음)보다 우선순위가 높습니다.

특히, 앞에 경로를 추가하는 것은 보안 관점에서 위험합니다. 왜냐하면 누군가가 귀하의 경로에 대한 쓰기 권한을 갖게 되면 ~/opt/bin거기에 다른 경로를 추가할 수 ls있고 귀하는 이를 /bin/ls실수로 사용할 수 있기 때문입니다. 이제 브라우저나 선택 항목이 동일하다고 상상해 보십시오 ssh. (경로에 .를 넣는 경우에도 마찬가지입니다.)

답변4

Linux는 환경 변수를 통해 실행 파일의 검색 경로를 결정합니다 $PATH. /data/myscripts 디렉토리를 환경 변수의 시작 부분에 추가하려면 $PATH다음 명령을 사용하십시오.

PATH=/data/myscripts:$PATH

경로 끝에 디렉터리를 추가하려면 다음 명령을 사용합니다.

PATH=$PATH:/data/myscripts

하지만 이전 내용만으로는 충분하지 않습니다. 스크립트 내에서 환경 변수를 설정하면 변경 사항이 스크립트 내에서만 적용되기 때문입니다. 이 제한 사항을 해결하는 방법은 두 가지뿐입니다.

  • 스크립트에서 환경 변수를 내보내면 환경 변수는 스크립트에서 호출되는 모든 프로그램에서 유효합니다. 스크립트를 호출하는 프로그램 내에서는 아무런 효과가 없습니다.
  • 스크립트를 호출하는 프로그램이 호출이 아닌 포함을 통해 스크립트를 호출하는 경우 스크립트의 모든 환경 변경 사항이 호출 프로그램에 적용됩니다. 이 포함은 dot 명령이나 source 명령을 사용하여 수행할 수 있습니다.

예:

$HOME/myscript.sh
source $HOME/myscript.sh

포함은 기본적으로 "호출" 스크립트를 "호출" 스크립트에 병합합니다. C의 #include와 같습니다. 따라서 "호출" 스크립트나 프로그램 내에서 작동합니다. 그러나 물론 호출 프로그램이 호출하는 프로그램이나 스크립트에는 아무런 영향을 미치지 않습니다. 호출 체인 전체에서 유효한 상태를 유지하려면 내보내기 명령을 사용하여 환경 변수의 설정을 존중해야 합니다.

예를 들어, bash 쉘 프로그램은 포함을 통해 .bash_profile 파일의 내용을 병합합니다. .bash_profile에 다음 두 줄을 입력하세요.

PATH=$PATH:/data/myscripts
export PATH

이 두 줄의 코드를 bash 프로그램에 효과적으로 넣으십시오. 따라서 bash에는 $PATH 변수가 포함되어 있으며 $HOME/myscript.sh내보내기 문으로 인해 bash가 호출하는 모든 프로그램에는 변경된 $PATH변수가 있습니다. bash 프롬프트에서 실행되는 모든 프로그램은 bash에 의해 호출되므로 새 경로는 bash 프롬프트에서 실행되는 모든 프로그램에 유효합니다.

가장 중요한 점은 경로에 새 디렉터리를 추가하려면 셸에 포함된 스크립트 내의 $PATH 환경 변수에 디렉터리를 추가하거나 추가해야 하며 환경 $PATH변수를 내보내야 한다는 것입니다.

추가 정보여기

관련 정보