$ PATH 변수에서 중복 경로 제거


125

$ PATH 변수에 동일한 경로를 6 번 정의했습니다.

작동 여부를 확인하기 위해 로그 아웃하지 않았습니다.

중복을 제거하려면 어떻게해야합니까?

$ PATH 변수는 다음과 같습니다.

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin

어떻게 재설정합니까?

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

6 번 정의한 곳은 어디입니까? 어떤 파일에?
hovanessyan


답변:


122

다음을 실행합니다.

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

그것은 현재 세션에 대한 것입니다. 만약 당신이 영구적으로 변경하고 싶다면 .bashrc, bash.bashrc, / etc / profile-당신의 시스템과 사용자가 필요로하는 모든 것에 추가하십시오.

참고 : 이것은 Linux 용입니다. 새로운 코더를 위해 이것을 명확히 할 것입니다. (`, ') SET = 이들을 시도하지 마십시오.


예, bash.bashrc에서 영구적으로 설정했습니다. 그렇다면 명령은 다음과 같아야합니까? echo 'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' >> ~/.bashrc
찰스 헨 드리

문제는 OS에 따라 일련의 구성이 실행된다는 것입니다. 나중에 PATH 변수를 덮어 쓰지 않도록해야합니다. 이를 수행하는 가장 쉬운 방법 (한 명의 사용자에 대해)은 일반적으로 그의 홈 디렉토리에있는 사용자의 개인 .bashrc에 덮어 쓰는 것입니다.
hovanessyan

1
명령은 PATH를-$ PATH (PATH의 현재 값) + 문자열 / usr / local / sbin : / usr / local / bin : / usr / sbin : / usr / bin : / sbin : / bin : /으로 설정합니다. usr / gam‌ es. 문자열 만 사용하려면 명령에서 $ PATH + 세미콜론 (:)을 제거하십시오. echo를 사용하거나 ~ / .bashrc 파일을 직접 편집하더라도 상관 없습니다.
hovanessyan

bash.bashrc 파일은 / etc 폴더에 있습니다. 내가 확실 편집에 어디 아니에요, 그래서 비록 $ PATH 변수를 표시하지 않습니다
찰스 헨 드리

첫 번째 주석에서 /etc/bash.bashrc가 아닌 ~ / .bashrc (인용 : >> ~ / .bashrc)에 에코합니다. 특정 사용자의 PATH를 변경하려면 / home / <사용자 이름> /. bashrc 파일에서 편집하십시오. /etc/bash.bashrc는 모든 사용자에게 적용됩니다.
hovanessyan

70

당신이 배쉬를 사용하는 경우, 당신은 또한의 당신이 디렉토리를 제거 할 말을하자, 경우 다음 작업을 수행 할 수 있습니다 /home/wrong/dir/귀하의에서 PATH변수 :

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`

1
제외하고 싶은 / etc / profile에 디렉토리가 추가되었지만 / etc에 대한 쓰기 액세스 권한이 없기 때문에 이것은 나에게 유용했습니다. 감사합니다 :)
Samizdis 2014

13
Protip : \ / 이스케이프를 피하기 위해 sed 식에서 다른 구분자를 사용할 수 있습니다.PATH=$(echo $PATH | sed -e 's|:/home/wrong/dir|$||')
iNecas

4
이 트릭은 새 PATH를 즉시 사용하고 현재 터미널에서 로그 아웃하고 싶지 않을 때 도움이됩니다. 그러나 엉망이되지 않도록하려면 PATH에 echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'할당하기 전에 PATH 생성 명령 (예 :)을 시험해보아야합니다 .
biocyberman

2
삭제할 경로가 .NET의 첫 번째 경로 인 경우 작동하지 않습니다 $PATH. 이것을 사용하십시오 :PATH=$(echo :$PATH: | sed -e 's,:/home/wrong/dir:,:,g' -e 's/^://' -e 's/:$//')
Robin Hsu

작동하지 않음 $ PATH=echo $ PATH | sed -e 's / : \ / scratch \ / sjn \ / anaconda \ / bin \ / python \ / $ //'``for remove / scratch / sjn / anaconda / bin / python
Mona Jalal

13

Linux : $ PATH 변수에서 중복 경로 제거

Linux From Scratch는 / etc / profile 에이 기능있습니다.

# Functions to help us manage paths.  Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

경로에 추가하기 위해 다음 함수와 함께 사용하기위한 것이므로 중복으로 수행하지 마십시오.

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

간단한 사용법은 pathremove제거 할 디렉토리 경로를 제공 하는 것입니다.하지만 정확히 일치해야합니다.

$ pathremove /home/username/anaconda3/bin

그러면 해당 디렉토리의 각 인스턴스가 경로에서 제거됩니다.

경로에 디렉토리를 원하지만 중복이 없으면 다른 기능 중 하나를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games

그러나 가독성이 문제가되지 않는 한이 시점에서 다음을 수행하는 것이 좋습니다.

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

위의 내용이 사람에게 알려진 모든 껍질에서 작동합니까?

나는에 일에 위의 가정 것이다 sh, dash그리고 bash적어도. csh, fish', orksh` 에서 작동하지 않는다는 사실에 놀랄 것 입니다. Windows 명령 셸 또는 Powershell에서 작동하지 않을까요?

Python이있는 경우 다음과 같은 종류의 명령이 직접 요청한 작업을 수행해야합니다 (즉, 중복 경로 제거).

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )

한 줄짜리 (여러 줄 문제를 회피하기 위해) :

$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )

위의 내용은 나중에 중복되는 경로를 제거합니다. 이전 중복 경로를 제거하려면 반전 된 목록의 인덱스를 사용하고 다시 반전하십시오.

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )

+1. pathremove ()는 csh, ksh, bash 등과 같은 모든 셸 버전에서 작동합니까? btw, RHEL의 / etc / profile에는 partremove ()가 없지만 pathmunge () 만 있습니다.
Tagar

1
@Tagar 다른 모든 셸과의 호환성에 대해 보장하지 않습니다. 사용중인 셸에서 테스트 해 보는 것이 좋습니다. 셸에서 작동하지 않는 경우 Python을 설치 한 경우 사용할 수 있습니다. 방법을 설명하기 위해 답변에 Python을 추가했습니다.
Aaron Hall

"3.5.3 Shell Parameter Expansion"을 올바르게 읽으면 ${!PATHVARIABLE}일종의 변수 간접적이지만 여기서 어떻게 작동하는지 잘 모르겠습니다. 설명해 주시겠습니까?
loxaxs

@loxaxs 이것은 local내장으로 선언 된 bash 함수의 지역 변수입니다 (함수 내에서만 사용할 수 있음). 추가 질문이 있으면 사이트에서 새 질문을해야 할 것입니다 (먼저 검색 한 후 정확한 복제본을 생성하지 않습니다 ...).
Aaron Hall

이것은 정말 흥미로운 답변입니다. 작성해 주셔서 감사합니다! 그러나 엉망이 된 PATH 변수를 정리하는 원래의 질문은 우아하게 해결되지 않는 것 같습니다 (이 함수를 사용할 때 처음부터 엉망이 된 PATH로 끝나지 않을 것입니다).
Christian Herenz

9

다음은 PATH를 정리하는 한 줄 코드입니다.

  • PATH의 순서를 방해하지 않고 중복 만 제거합니다.
  • : 및 PATH를 우아하게 처리합니다.
  • 특수 문자가 사용되지 않으므로 이스케이프가 필요하지 않습니다.
  • /bin/awkPATH가 손상 되어도 작동하도록 사용합니다.

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";

1
누구든지 그것을 시험 했습니까? 는 안전하다?
Joe RR

2
당신이하지 않으면 AWK는 에코 $의 PATH와 전에, 내가 txt 파일에 대한 경로를 복사 조언한다 경로를 청소 설치
호세 피타에게

나를 위해 작동하지 않습니다 ... awk가 설치되어 있지만 일부 중복 항목이 제거되지 않았습니다.
Christian Herenz 2010

3
  1. 다만 echo $PATH
  2. 텍스트 편집기로 세부 사항 복사
  3. 원하지 않는 항목 제거
  4. PATH= # pass new list of entries

2

중복 경로를 제거하려면 여러 perl5 / bin 경로에 문제가 있었기 때문에 잠시 전에 작성한이 스크립트를 사용합니다.

#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current shell gets the changes.

pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`

# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
    if test -d $dir ; then
        if test -z $PATH; then
            PATH=$dir
        else
            PATH=$PATH:$dir
        fi
    fi
done
export PATH
# echo "After loop, PATH: $PATH"

그리고 마지막에 ~ / .profile에 넣습니다. BASH를 거의 독점적으로 사용하기 때문에 다른 쉘에서는 시도하지 않았습니다.


1
솔루션에 +1. Btw, 중복 경로는 목록에 차례로 들어가는 경우에만 제거됩니다. 당신은 변경 될 수 있습니다 |uniq|sort|uniq이 문제를 해결하기 위해, 그러나 이것은 내가 바람직한 부작용이라고 생각하지 않는 경로에있는 모든 디렉토리의 순서를 변경합니다.
Tagar

1

셸이 Bash라고 가정하면 다음을 사용하여 경로를 설정할 수 있습니다.

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

그러나 Levon이 다른 답변에서 말했듯이 쉘을 종료하자마자 변경 사항이 사라집니다. 당신은 아마 당신 설정할 PATH의를 ~/.bash_profile~/.bashrc.


1

bash에서는 간단히 $ {var / find / replace} 할 수 있습니다.

PATH=${PATH/%:\/home\/wrong\/dir\//}

또는이 경우 (교체 비트가 비어 있기 때문에) 다음과 같습니다.

PATH=${PATH%:\/home\/wrong\/dir\/}

나는 여기에 먼저 왔지만 이것을 수행하기 위해 매개 변수 확장 이있을 것이라고 생각했기 때문에 다른 제품을 사용 했습니다. sed보다 쉽습니다!.

변수의 자리 표시 자 문자 또는 단어를 Bash의 다른 변수 값으로 바꾸는 방법은 무엇입니까?


%문자열의 끝이 #시작 인 경우 일치를 의미 합니다.
sabgenton 2015 년

0

값을 "편집"하는 표준 도구는 없습니다 $PATH(예 : "이미 존재하지 않는 경우에만 폴더 추가"또는 "이 폴더 제거").

다음에 로그인 할 때 경로가 무엇인지 확인하려면 telnet localhost(또는 telnet 127.0.0.1)을 사용하십시오. 그런 다음 사용자 이름과 암호를 묻습니다.

이것은 새로운 로그인 쉘을 제공합니다 (즉, 현재 환경에서 아무것도 상속하지 않는 완전히 새로운 쉘).

$PATH거기 의 값을 확인하고 정확할 때까지 rc 파일을 편집 할 수 있습니다. 이것은 중요한 파일을 변경 한 후 다시 로그인 할 수 있는지 확인하는데도 유용합니다.


사용자 이름 / 비밀번호를 입력 할 필요없이 /bin/bash -i. 훨씬 덜 번거 로움.
Ed Heal

0

이러한 중복 경로를 PATH 변수에 어떻게 추가 했습니까? .파일 중 하나를 편집해야 합니다. ( .tcshrc, 또는 .bashrc, 등은 특정 시스템 / 셸에 따라 다름). 이를 수정하는 방법은 파일을 다시 편집하고 중복 경로를 제거하는 것입니다.

당신이 경우 하지 않은 파일을 편집하고 당신은 대화 형으로 PATH를 수정해야합니다. 이 경우 변경 사항이 "고정"되지 않습니다. 즉, 다른 셸을 열거 나 로그 아웃했다가 다시 로그인하면 변경 사항이 자동으로 사라집니다.

일부 시스템 전체 구성 파일도 있지만 수정하지 않았을 가능성이 높으므로 개인 홈 디렉토리의 파일을 변경할 가능성이 높습니다 (경로 세트를 설정 한 후 이러한 변경 사항을 영구적으로 적용하려는 경우).


0

간편한 복사-붙여 넣기 템플릿을 위해 다음 Perl 스 니펫을 사용합니다.

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`

이렇게하면 대체 연산자를 위해 슬래시를 이스케이프 할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.