it-swarm-korea.com

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

PATH 환경 변수에 새 경로를 추가해야하는 곳이 궁금합니다. .bashrc (예 :), 그러나이 작업을 수행하는 방법이 명확하지 않습니다.

이 방법:

export PATH=~/opt/bin:$PATH

아니면 이거?

export PATH=$PATH:~/opt/bin
994
Paolo

간단한 것들

PATH=$PATH:~/opt/bin

또는

PATH=~/opt/bin:$PATH

~/opt/bin를 마지막에 추가할지 (여러 디렉토리에 동일한 이름의 프로그램이있는 경우 다른 모든 디렉토리를 검색 한 후) 또는 시작 (다른 모든 항목보다 먼저 검색 할 것인지)에 따라 디렉토리).

여러 항목을 동시에 추가 할 수 있습니다. PATH=$PATH:~/opt/bin:~/opt/node/bin 또는 주문의 변형이 잘 작동합니다. export 행을 추가로 복잡하게 만들지 마십시오 (아래 "bash 이외의 쉘에 대한 참고 사항"참조).

PATH이 (가) 여러 구성 요소로 구축 된 경우 중복 항목이 생길 수 있습니다. 중복을 추가하거나 제거하지 않으려면 NIX에서 검색 할 홈 디렉토리 경로를 추가하는 방법은 무엇입니까?awk 명령으로 중복 $ PATH 항목 제거 을 참조하십시오.

일부 배포판에서는 ~/bin가 있으면 PATH에 자동으로 저장됩니다.

넣을 곳

PATH를 수정하려면 ~/.profile 또는 ~/.bash_profile에서 수정하십시오.

~/.bash_rc는 어떤 프로그램도 읽을 수 없으며 ~/.bashrc는 bash의 대화식 인스턴스 구성 파일입니다. ~/.bashrc에서 환경 변수를 정의해서는 안됩니다. PATH와 같은 환경 변수를 정의하는 올바른 위치는 ~/.profile입니다 (또는 bash 이외의 쉘을 신경 쓰지 않으면 ~/.bash_profile). 그것들과 어떤 것을 사용해야합니까? 참조

/etc/environment 또는 ~/.pam_environment에 넣지 마십시오. 이들은 셸 파일이 아니므로 $PATH와 같은 대체를 사용할 수 없습니다. 이러한 파일에서는 변수를 재정의 할 수 있으며 추가 할 수는 없습니다.

일부 시스템 스크립트의 잠재적 합병증

변수가 이미 환경에있는 경우 export가 필요하지 않습니다. 변수 값의 변경 사항이 환경에 반영됩니다 .¹ PATH는 항상 환경에 있습니다. 모든 유닉스 시스템은 초기에 (보통 첫 번째 프로세스에서) 매우 일찍 설정했습니다.

로그인시 이미 환경에 있고 일부 시스템 디렉토리를 포함하고있는 PATH에 의존 할 수 있습니다. 어떤 종류의 가상 환경을 설정하는 동안 일찍 실행될 수있는 스크립트를 작성하는 경우 PATH가 비어 있지 않고 내 보내야합니다. PATH이 아직 설정되어 있지 않은 경우 그런 다음 PATH=$PATH:/some/directory와 같이 PATH:/some/directory로 설정하고 처음에 비어있는 구성 요소는 현재 디렉토리 (.:/some/directory와 같은)를 의미합니다.

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

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

Bash, ksh 및 zsh에서 export은 특수 구문이며 PATH=~/opt/bin:$PATHexport PATH=~/opt/bin:$PATH는 모두 올바른 일을합니다. 대시 (많은 시스템에서 /bin/sh)와 같은 다른 Bourne/POSIX 스타일 쉘에서 export는 일반적인 명령으로 구문 분석되며 두 가지 차이점이 있습니다.

대시와 같은 껍질에는 export PATH=~/opt/bin:$PATH PATH를 리터럴 문자열 ~/opt/bin/:로 설정 한 다음 PATH 값을 첫 번째 공백까지 설정합니다. PATH=~/opt/bin:$PATH (맨손으로 할당) 따옴표가 필요하지 않음 그리고 옳은 일을합니다. 이식 가능한 스크립트에서 export를 사용하려면 export PATH="$HOME/opt/bin:$PATH" 또는 PATH=~/opt/bin:$PATH; export PATH (또는 PATH=$HOME/opt/bin:$PATH; export PATH)를 작성해야합니다. export var=value를 수락하지 않았고 물결표 확장을 수행하지 않았습니다).

¹ 이것은 현대 포 식스 스타일 쉘이 아닌 실제 Bourne 쉘에서와 같이 Bourne 쉘에서는 사실이 아니었지만 요즘에는 오래된 쉘을 만날 가능성이 거의 없습니다.

질문 2로 인해 혼란 스럽습니다 (관련되지 않은 문제로 인해 질문에서 제거되었으므로).

다른 줄에 더 많은 경로를 추가 할 수있는 방법은 무엇입니까? 처음에는 이것이 트릭을 수행 할 수 있다고 생각했습니다.

export PATH=$PATH:~/opt/bin
export PATH=$PATH:~/opt/node/bin

두 번째 과제는 ~/opt/node/bin 및 이전에 할당 된 전체 PATH.

가능한 해결 방법은 다음과 같습니다.

export PATH=$PATH:~/opt/bin:~/opt/node/bin

그러나 가독성을 위해 하나의 경로에 대해 하나의 할당을 선호합니다.

당신이 말하는 경우

PATH=~/opt/bin

그것은 all 당신의 PATH에있을 것입니다. PATH는 환경 변수 일 뿐이므로 PATH에 추가하려면 원하는 내용으로 변수를 다시 작성해야합니다. 즉, 질문 2의 예로 제시하는 것은 질문의 요점을 완전히 누락하지 않는 한 정확하게하려는 것입니다.

코드에서 두 양식을 모두 사용합니다. 잠재적으로 누락되는 디렉토리를 수용하기 위해 작업하는 모든 시스템에 다음과 같은 일반 프로파일을 설치했습니다.

export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
    if [ -d $bindir ]; then
        PATH=$PATH:${bindir}
    fi
done
39
Carl Cravens

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

PATH=/data/myscripts:$PATH

해당 디렉토리를 경로 끝에 추가하려면 다음 명령을 사용하십시오.

PATH=$PATH:/data/myscripts

그러나 스크립트 내에서 환경 변수를 설정하면 해당 변경 사항이 스크립트 내에서만 적용되므로 위의 내용만으로는 충분하지 않습니다. 이 제한에는 두 가지 방법 만 있습니다.

  • 스크립트 내에서 환경 변수를 내 보내면 스크립트에서 호출 한 모든 프로그램 내에서 유효합니다. 스크립트를 호출 한 프로그램에서는 효과가 없습니다.
  • 스크립트를 호출하는 프로그램이 호출하는 대신 포함하여 포함하는 경우 스크립트의 모든 환경 변경은 호출 프로그램 내에서 유효합니다. 이러한 포함은 dot 명령 또는 source 명령으로 수행 할 수 있습니다.

예 :

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

포함은 기본적으로 "호출"스크립트에 "호출"스크립트를 통합합니다. C의 #include와 같습니다. 따라서 "호출"스크립트 나 프로그램에서 효과적입니다. 그러나 호출 프로그램이 호출하는 프로그램이나 스크립트에서는 효과적이지 않습니다. 콜 체인 전체에 적용하려면 내보내기 명령으로 환경 변수 설정을 따라야합니다.

예를 들어, bash Shell 프로그램은 .bash_profile 파일의 내용을 포함하여 통합합니다. .bash_profile에 다음 두 줄을 배치하십시오.

PATH=$PATH:/data/myscripts
export PATH

이 두 줄의 코드를 효과적으로 bash 프로그램에 넣습니다. 따라서 bash 내에서 $ PATH 변수에는 $HOME/myscript.sh가 포함되며, export 문으로 인해 bash가 호출 한 모든 프로그램에는 변경된 $PATH 변수가 있습니다. 그리고 bash 프롬프트에서 실행하는 모든 프로그램은 bash에 의해 호출되므로 bash 프롬프트에서 실행하는 모든 항목에 대해 새 경로가 적용됩니다.

결론은 경로에 새 디렉토리를 추가하려면 셸에 포함 된 스크립트 내에서 $ PATH 환경 변수에 디렉토리를 추가하거나 추가하고 $PATH 환경 변수를 내 보내야한다는 것입니다.

자세한 정보 여기

25
Steve Brown

얼마 동안 저는 중복에 대해 걱정할 필요없이 경로에 요소를 추가하는 데 도움이되는 두 개의 함수 pathaddpathrm를 유지했습니다.

pathadd는 단일 경로 인수와 선택적인 after 인수를 사용합니다.이 인수는 제공된 경우 PATH에 추가됩니다. 그렇지 않으면 앞에 추가됩니다.

거의 모든 상황에서 경로에 추가하는 경우 경로에 이미있는 것을 무시하고 싶을 가능성이 있으므로 기본적으로 앞에 추가하도록 선택합니다.

pathadd() {
    newelement=${1%/}
    if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
        if [ "$2" = "after" ] ; then
            PATH="$PATH:$newelement"
        else
            PATH="$newelement:$PATH"
        fi
    fi
}

pathrm() {
    PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}

이것을 PATH 환경을 변경하려는 스크립트에 넣고 지금 할 수 있습니다.

pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH

경로가 이미있는 경우 경로에 추가하지 않아야합니다. 이제 /baz/bat 시작입니다.

pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH

경로가 이미 배가되지 않은 경우 경로를 앞으로 이동할 수 있습니다.

20
Brett Ryan

다른 배포판에 대해서는 말할 수 없지만 Ubuntu에는/etc/environment 파일이 있으며 이는 모든 사용자의 기본 검색 경로입니다. 내 컴퓨터는 나만 사용하므로 스크립트에 임시로 추가하지 않는 한 원하는 경로를 내 경로에 넣습니다.

10
Jim Bradley

PATH=/a/b:$PATH를 사용하여 PATH에 경로를 추가하는 "잘못된"방법으로 간주 될 수있는 상황이 있습니다.

  1. 실제로 디렉토리가 아닌 경로 추가.
  2. 동일한 형식으로 이미 PATH에있는 경로 추가.
  3. 상대 경로 추가 (검색된 실제 디렉토리는 현재 작업 디렉토리를 변경함에 따라 변경되므로).
  4. 이미 다른 형식으로 PATH에있는 경로 추가 (예 : 심볼릭 링크 또는 .. 사용으로 인한 별칭) 추가.
  5. 4를 수행하지 않으면 PATH의 다른 항목을 대체하려는 경우 경로를 PATH의 앞쪽으로 이동하지 마십시오.

이 (Bash-only) 기능은 위 상황에서 "올바른 일"을 수행하고 (예외는 아래 참조) 오류 코드를 반환하며 사람에게 Nice 메시지를 인쇄합니다. 오류 코드와 메시지는 원하지 않을 때 비활성화 할 수 있습니다.

prepath() {
    local usage="\
Usage: prepath [-f] [-n] [-q] DIR
  -f Force dir to front of path even if already in path
  -n Nonexistent dirs do not return error status
  -q Quiet mode"

    local tofront=false errcode=1 qecho=echo
    while true; do case "$1" in
        -f)     tofront=true;       shift;;
        -n)     errcode=0;          shift;;
        -q)     qecho=':';          shift;;
        *)      break;;
    esac; done
    # Bad params always produce message and error code
    [[ -z $1 ]] && { echo 1>&2 "$usage"; return 1; }

    [[ -d $1 ]] || { $qecho 1>&2 "$1 is not a directory."; return $errcode; }
    dir="$(command cd "$1"; pwd -P)"
    if [[ :$PATH: =~ :$dir: ]]; then
        $tofront || { $qecho 1>&2 "$dir already in path."; return 0; }
        PATH="${PATH#$dir:}"        # remove if at start
        PATH="${PATH%:$dir}"        # remove if at end
        PATH="${PATH//:$dir:/:}"    # remove if in middle
    fi
    PATH="$dir:$PATH"
}

단,이 함수는 다른 방법을 통해 PATH에 추가 된 경로를 정규화 할 수 없으므로 경로의 비정규 별칭이 PATH에 있으면 중복이 추가됩니다. PATH에 이미있는 경로를 정규화하려고 시도하는 것은 상대 경로가 prepath에 전달 될 때 분명한 의미를 갖지만 이미 경로에있을 때 현재 작업 디렉토리가 무엇인지 알 수 없기 때문에 멍청한 제안입니다 추가되었을 때.

7
cjs

PATH 환경 변수에 새 경로를 추가하려면 다음을 수행하십시오.

export PATH=$PATH:/new-path/

이 변경 사항을 여는 모든 셸에 적용하려면 셸이 호출 될 때 셸이 source 할 파일에 추가하십시오. 다른 쉘에서는 다음과 같습니다.

  • Bash Shell : ~/.bash_profile, ~/.bashrc 또는 프로파일
  • Korn Shell : ~/.kshrc 또는 .profile
  • Z 쉘 : ~/.zshrc 또는 .zprofile

예 :.

# export PATH=$PATH:/root/learning/bin/
# source ~/.bashrc
# echo $PATH

위 출력에서 ​​제공된 경로를 볼 수 있습니다.

7
Amit24x7

저에게 (Mac OS X 10.9.5의 경우) 경로 이름 (예 : /mypathname)을 파일 /etc/paths에 추가하면 매우 효과적이었습니다.

편집하기 전에 echo $PATH는 다음을 반환합니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

/etc/paths를 편집하고 셸을 다시 시작하면 $ PATH 변수에 /pathname가 추가됩니다. 실제로 echo $PATH는 다음을 반환합니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

/mypathname 변수에 $PATH가 추가되었습니다.

6
faelx

내 해결책은 다음과 같습니다.

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")

후행을 남기지 않는 멋진 쉬운 하나의 라이너 :

5
AJ.