$ PATH에서 중복 디렉토리를 제거하는 방법? PATH변수에 중복 항목이 있습니다. 이 같은: PATH=/a/b:/c/d:/a/b:/c/d:/e/f:/a/b 나는

내 터미널 창의 일부에는 PATH변수에 중복 항목이 있습니다. 이 같은:

PATH=/a/b:/c/d:/a/b:/c/d:/e/f:/a/b

나는 내 스크립트 중 일부에서 범인이 이와 같은 줄이라고 생각합니다.

PATH=/a/b:$PATH

이것을 소싱 한 후 다시 PATH매우 길어집니다. 이것은 질문입니다 :

bash정리 PATH및 유사한 env 변수에 대한 명령이 있습니까? bash유틸리티를 실행할 수없고 호출 쉘의 환경이 변경 될 것으로 예상하기 때문에 스크립트 여야합니다 .

위의 예에서 정리 된 내용 PATH은 다음과 같아야합니다.

PATH=/a/b:/c/d:/e/f


답변

나중에 복제본을 제거하는 것보다 복제본을 생성하지 않는 것이 좋습니다. .bashrc개인 bin/디렉토리 를 추가하는 데 사용하는 기술을 사용하면 쉽게 피할 수 있습니다 .

[ "${PATH#*$HOME/bin:}" == "$PATH" ] && export PATH="$HOME/bin:$PATH"

업데이트 할 때이 작업을 수행 .bashrc했으며 셸을 다시 시작하지 않고 다시 실행하려고했습니다.

끝에 디렉토리를 추가 $PATH하려면 선행 콜론을 사용해야합니다.

[ "${PATH#*:$HOME/bin}" == "$PATH" ] && export PATH="$PATH:$HOME/bin"

매개 변수 확장을 사용하여 PATH중복 을 단계별로 제거하고 제거 할 수 있지만 약간 복잡하므로 유지해야 할 위치를 결정해야합니다. 라인을 따라 뭔가 :-

OLDPATH="$PATH"; NEWPATH=""; colon=""
while [ "${OLDPATH#*:}" != "$OLDPATH" ]
do  entry="${OLDPATH%%:*}"; search=":${OLDPATH#*:}:"
    [ "${search#*:$entry:}" == "$search" ] && NEWPATH="$NEWPATH$colon$entry" && colon=:
    OLDPATH="${OLDPATH#*:}"
done
NEWPATH="$NEWPATH:$OLDPATH"
export PATH="$NEWPATH"

이것을 즉시 작성하고 지금 테스트 한 후에, 나는 대부분의 오류를 제거했을 것입니다. 그리고 그것은 당신이해야 할 일에 대한 적절한 가이드가되어야합니다. 복제본 의 마지막 항목은 그대로 둡니다 . 처음에 복제본을 피하기 위해 스크립트를 사용한 경우 복제본이있는 곳입니다. 스크립트에서는 물론 ./ source명령 으로 호출해야합니다 .


답변

Microsoft technet은 파워 쉘 스크립트를 사용하여이 문제를 해결합니다 . 이 스크립트는 PATH변수 에서 중복 항목을 식별하고 제거 합니다.

그것은 말한다 :

때때로 소프트웨어를 반복 설치하면 PATH 환경 변수에 중복 항목이 추가 될 수 있습니다. 환경 변수에는이 변수의 크기에 하드 코딩 된 제한이 있으므로 일정 기간 동안 제한 될 수 있습니다. 이 스크립트는 PATH 환경 변수를 확인하고 중복 경로 항목을 제거합니다.


답변