나는 bashrc의 친구 중 일부를 소싱합니다. 그래서 $ PATH 변수에 중복 항목이 생깁니다. 명령을 시작하는 데 시간이 오래 걸리는 문제인지 확실하지 않습니다. bash에서 $ PATH는 내부적으로 어떻게 작동합니까? 더 많은 경로가 있으면 시작 시간이 느려 집니까?
zsh
, 그것은 단순하게입니다 typeset -aU path
FWIW, .
나는 bashrc의 친구 중 일부를 소싱합니다. 그래서 $ PATH 변수에 중복 항목이 생깁니다. 명령을 시작하는 데 시간이 오래 걸리는 문제인지 확실하지 않습니다. bash에서 $ PATH는 내부적으로 어떻게 작동합니까? 더 많은 경로가 있으면 시작 시간이 느려 집니까?
zsh
, 그것은 단순하게입니다 typeset -aU path
FWIW, .
답변:
더 많은 항목이 $PATH
있다고해서 시작 속도가 느려지지는 않지만 셸 세션에서 특정 명령을 처음 실행할 때마다 속도가 느려집니다 (bash가 캐시를 유지하기 때문에 명령을 실행할 때마다는 아닙니다). 특히 느린 파일 시스템 (예 : NFS, Samba 또는 기타 네트워크 파일 시스템 또는 Cygwin)이없는 경우 속도 저하를 거의 감지 할 수 없습니다.
당신이 $PATH
시각적으로 검토 할 때 중복 항목도 약간 성가시다 , 당신은 더 부스러기를 통과해야합니다.
중복 항목을 추가하지 않아도됩니다.
case ":$PATH:" in
*":$new_entry:"*) :;; # already there
*) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac
참고 : 다른 사람의 쉘 스크립트를 소싱한다는 것은 그가 작성한 코드를 실행하는 것을 의미합니다. 즉, 친구는 언제든지 친구에게 계정에 대한 액세스 권한을 부여합니다.
참고 사항 : .bashrc
설정 $PATH
하거나 다른 환경 변수 가 올바른 장소가 아닙니다 . 환경 변수는에서 설정해야합니다 ~/.profile
. 참조 어떤 설정 파일은 떠들썩한 파티와 환경 변수를 설정하는 데 사용되어야 하는가? , .bashrc와 .bash_profile의 차이점 .
case :$PATH:
하고 사용 하지 않습니다 case $PATH
.
사람들이 PATH 변수에서 다음을 사용하여 복제본을 정리하는 것을 보았습니다 awk
.
PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')
자신의 bashrc에 추가하고 다른 파일을 실행하기 전에 다른 파일을 소스로 만들 수 있습니다.
대안은 유틸리티 를 사용 하는pathmerge
것 입니다.
속도 문제와 관련하여 이것은 쉘의 시작 시간에 큰 영향을 미치지 않지만 특히 명령이 경로에서 발견되지 않고 동일한 경로를 통해 검색을 반복하는 경우 명령에 대한 탭 완성을 수행하는 데 시간을 절약 할 수 있습니다 폴더를 찾고 있습니다.
보안에 대한주의 사항 : 당신이해야 정말 주의 질 '경고 여기에 보안에 대한합니다. 다른 사용자가 소유 한 파일을 소싱함으로써 쉘을 시작할 때마다 해당 사용자에게 자신의 코드를 실행할 수있는 무료 패스를 제공합니다. 암호를 사용하여 해당 사용자를 신뢰하지 않으면 해당 셸 파일을 소싱해서는 안됩니다.
PATH=$(echo "$PATH" | awk -v RS=':' -v ORS=":" '!a[$1]++{if (NR > 1) printf ORS; printf $a[$1]}')
:
은 외관상의 문제가 아닙니다. .
경로에 추가하는 것과 동일하며 잠재적으로 위험합니다.
첫 번째 일치 만 $PATH
실행되므로 이후의 모든 항목은 처리되지 않습니다. 그렇기 때문에 때때로 $PATH
환경이 예상대로 작동하도록 항목의 순서를 수정해야합니다 .
귀하의 질문에 대답하기 위해 : 이것은 느린 시작의 원인이되어서는 안됩니다.
TAB
? 로 명령을 완료하는 것을 의미 합니까? 이 경우 정의를 완료 한 것이 아닌지 확인해야합니다 complete -c which -a
. -a
매개 변수를 삭제해야합니다 . 다음 명령을 실행하여이를 확인할 수 있습니다 complete | grep which
..
내 PATH에 중복 항목을 방지하기 위해 ~ / .bash_profile 및 ~ / .bashrc에 다음을 입력해야했습니다.
PATH=$(echo $(sed 's/:/\n/g' <<< $PATH | sort | uniq) | sed -e 's/\s/':'/g')
주요 단점은 PATH 항목을 정렬한다는 것입니다.하지만 나는 그걸로 살 수 있다고 생각합니다.