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

$ 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



답변

다음을 실행합니다.

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

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

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


답변

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

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


답변

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)))
" )


답변

다음은 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. 다만 echo $PATH
  2. 텍스트 편집기로 세부 사항 복사
  3. 원하지 않는 항목 제거
  4. PATH= # pass new list of entries

답변

중복 경로를 제거하려면 여러 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를 거의 독점적으로 사용하기 때문에 다른 쉘에서는 시도하지 않았습니다.


답변

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

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

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