source
my -d에 다음 코드가 있습니다..shellrc
PATH="${PATH}:${HOME}/perl5/bin"
PATH="${PATH}:${HOME}/.bin"
export PATH
그러나 다른 코드를 변경한 다음 source
이 파일을 변경하면 각 소스에 대한 경로가 점점 길어지고 소스가 이미 존재할 때마다 소스가 추가됩니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
답변1
add_to_PATH () {
for d; do
d=$({ cd -- "$d" && { pwd -P || pwd; } } 2>/dev/null) # canonicalize symbolic links
if [ -z "$d" ]; then continue; fi # skip nonexistent directory
case ":$PATH:" in
*":$d:"*) :;;
*) PATH=$PATH:$d;;
esac
done
}
add_to_PATH ~/perl5/bin ~/.bin
심볼릭 링크 정규화 라인은 선택 사항입니다. 삭제하면 다음 줄도 삭제하거나(존재하지 않는 디렉터리를 유지하려는 경우) 다음 줄로 변경합니다.
if ! [ -d "$d" ]; then continue; fi
기호 링크 정규화 방법은 이 함수에 의해 추가된 디렉터리 간의 고유성만 보장한다는 점에 유의하세요. 또한 두 위치에 마운트된 NFS 디렉터리나 Linux 바인드 마운트와 같은 엣지 케이스도 처리하지 않습니다.
답변2
추가하기 전에 이미 경로에 있는지 확인하는 "이 디렉토리를 경로에 추가" 명령을 테스트할 수 있지만 foo
그렇게 하면 큰 이점을 얻을 수 없습니다.
첫째, 반복적인 요소를 부착하는 것에 비해 테스트 자체의 비용이 높다. 둘째, 경로에서 처음으로 일치하는 실행 파일이 계속 실행되기 때문에 경로의 이후 중복 요소는 지정된 명령이 실행될 때 실행되는 항목에 영향을 주지 않습니다. 마지막으로 대부분의 쉘은 이전 경로 적중을 해시 테이블에 캐시하므로 my_command
경로가 두 번째 실행될 때 경로가 검색되지도 않습니다.
중복된 항목을 추가하지 않음으로써 얻을 수 있는 유일한 것은 경로가 더 예뻐 보이는 것입니다. 그러나 대부분의 경로는 처음부터 꽤 보기 흉합니다. 이 미적 목표가 정말로 중요하다면 어떤 셸을 사용하고 있는지 알려주시면 "존재하지 않는 경우에만 경로에 추가"하는 기능을 제안해 드릴 수 있습니다.
답변3
내가 사용하는 기능은 OS X의 fink 초기화 스크립트에서 파생되었습니다(그래서 신용은 fink 개발자에게 돌아갑니다). 훌륭하게 작동하며 언제든지 .bash_profile 리소스를 다시 가져올 수 있습니다. 어떻게 작동하는지 묻지 마세요... 저는 단지 이것이 이런 것이라는 것을 알고 있을 뿐입니다 :)
# define append_path and prepend_path to add directory paths, e.g. PATH, MANPATH
# add to end of path
append_path()
{
if ! eval test -z "\"\${$1##*:$2:*}\"" -o -z "\"\${$1%%*:$2}\"" -o -z "\"\${$1##$2:*}\"" -o -z "\"\${$1##$2}\"" ; then
eval "$1=\$$1:$2"
fi
}
# add to front of path
prepend_path()
{
if ! eval test -z "\"\${$1##*:$2:*}\"" -o -z "\"\${$1%%*:$2}\"" -o -z "\"\${$1##$2:*}\"" -o -z "\"\${$1##$2}\"" ; then
eval "$1=$2:\$$1"
fi
}
$PATH
다음과 같이 or 에 추가하거나 앞에 추가하는 데 사용할 수 있습니다 $MANPATH
(비슷한 형식의 변수와 함께 작동함 $PATH
).
prepend_path PATH $macPortsDir/sbin
prepend_path MANPATH $macPortsDir/man
답변4
당신이 할 수 있는 한 가지는 환경 변수를 보호로 사용하는 것입니다. 그래서 환경을 __<your script>__path_added
.
스크립트에서 경로를 추가하기 전에 경로가 설정되어 있는지 테스트할 수 있습니다. C 헤더 가드와 비슷합니다.