$PATH에 깔끔하게 추가하는 방법은 무엇입니까?

$PATH에 깔끔하게 추가하는 방법은 무엇입니까?

동일한 경로를 여러 번 추가하지 않고도 시스템 전체 또는 개별 사용자를 위해 $PATH에 항목을 추가할 수 있는 방법을 원합니다.

이를 원하는 이유 중 하나는 로그인이 필요하지 않은 에 추가할 수 있고 를 호출하지 않는 .bashrc(예를 들어) 를 사용하는 시스템에서 더 유용하기 때문 입니다 .lightdm.profile

나는 문제에 대해 알고중복을 지우는 방법$PATH에서, 그러나중복된 항목을 제거하고 싶지 않습니다.. 나는 방법을 원한다경로가 아직 존재하지 않는 경우에만 경로를 추가하세요.

답변1

추가하려는 새 경로는 다음과 같습니다.

new=/opt/bin

new그런 다음 POSIX 셸을 사용하여 이미 경로에 있는지 테스트하고 그렇지 않은 경우 추가할 수 있습니다 .

case ":${PATH:=$new}:" in
    *:"$new":*)  ;;
    *) PATH="$new:$PATH"  ;;
esac

콜론 사용에 주의하세요. 콜론이 없으면 new=/bin패턴이 와 동일하기 때문에 이미 경로에 있다고 가정할 수 있습니다 /usr/bin. PATH에는 일반적으로 많은 요소가 있지만 PATH의 요소가 0개와 1개인 특수한 경우도 처리됩니다. PATH에 처음에 요소가 없는 경우(비어 있음)는 비어 있는 경우 ${PATH:=$new}이를 사용하여 PATH처리됩니다 $new. 이런 방식으로 매개변수 기본값을 설정하는 것은 모든 POSIX 셸의 기능입니다. 섹션 2.6.2를 참조하세요.POSIX 문서.)

호출 가능한 함수

편의상 위의 코드를 함수에 넣을 수 있습니다. 이 함수는 명령줄에서 정의할 수 있으며, 영구적으로 사용하려면 셸의 init 스크립트에 넣으세요(bash 사용자의 경우 다음과 같습니다 ~/.bashrc).

pupdate() { case ":${PATH:=$1}:" in *:"$1":*) ;; *) PATH="$1:$PATH" ;; esac; }

이 경로 업데이트 기능을 사용하여 현재 PATH에 디렉터리를 추가하려면:

pupdate /new/path

답변2

/etc/profile.d예를 들어 mypath.sh(또는 원하는 대로) 라는 파일을 만듭니다 . lightdm을 사용하는 경우 사용 가능한지 확인하고, 그렇지 않으면 동일한 파일을 사용하거나 /etc/bashrc해당 파일에서 시작하세요. 다음 기능을 추가합니다.

checkPath () {
        case ":$PATH:" in
                *":$1:"*) return 1
                        ;;
        esac
        return 0;
}

# Prepend to $PATH
prependToPath () {
        for a; do
                checkPath $a
                if [ $? -eq 0 ]; then
                        PATH=$a:$PATH
                fi
        done
        export PATH
}

# Append to $PATH
appendToPath () {
        for a; do
                checkPath $a
                if [ $? -eq 0 ]; then
                        PATH=$PATH:$a
                fi
        done
        export PATH
}

$PATH의 시작(앞에 추가) 내용이 그 뒤의 내용보다 우선하며, 반대로 끝(추가) 내용이 이전 내용으로 대체됩니다. 즉, $PATH가 있고 /usr/local/bin:/usr/bin두 디렉터리 모두에 실행 파일이 있는 경우 gotcha기본적으로 해당 디렉터리에 있는 실행 파일이 사용됩니다./usr/local/bin

이제 동일한 파일, 다른 셸 구성 파일 또는 명령줄에서 사용할 수 있습니다.

appendToPath /some/path /another/path
prependToPath /some/path /yet/another/path

에 있으면 .bashrc새 셸을 시작할 때 값이 여러 번 나타나는 것을 방지합니다. 제한 사항이 있습니다. 미리 추가된 콘텐츠를 추가하거나(예: $PATH 내에서 경로 이동) 그 반대로 하려면 이 작업을 직접 수행해야 합니다.

답변3

다음을 수행할 수 있습니다.

echo $PATH | grep /my/bin >/dev/null || PATH=$PATH:/my/bin

참고: 다른 변수에서 PATH를 빌드하는 경우 많은 쉘이 ""를 "."로 해석하므로 해당 변수가 비어 있지 않은지 확인하십시오.

답변4

~/.profile나는 수년간 다양한 파일에 이 작은 기능을 가지고 다녔습니다./etc/profileRed Hat Linux 및 그 파생 제품(CentOS, Fedora) 에 존재합니다..

pathmunge () {
        if ! echo $PATH | /bin/grep -Eq "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

따라서 다음 디렉토리의 시작 부분에 새 디렉토리를 추가하십시오 PATH.

pathmunge /new/path

끝까지:

pathmunge /new/path after

관련 정보