실행 파일의 전체 경로를 지정하지 않고 프로그램을 실행하고 Bash가 $PATH
바이너리를 찾기 위해 디렉토리를 검색 해야하는 경우 Bash는 일종의 캐시에서 경로를 기억하는 것으로 보입니다. 예를 들어 source에서 Subversion 빌드를 설치 한 /usr/local
다음 svnsync help
Bash 프롬프트에 입력 했습니다. Bash /usr/local/bin/svnsync
는 “svnsync” 의 바이너리 를 찾아서 실행했습니다. 그런 다음 Subversion 설치를 삭제 /usr/local
하고 다시 실행 svnsync help
하면 Bash가 응답합니다.
bash: /usr/local/bin/svnsync: No such file or directory
그러나 Bash의 새 인스턴스를 시작하면를 찾아 실행 /usr/bin/svnsync
합니다.
실행 파일 경로 캐시를 지우려면 어떻게해야합니까?
답변
bash
명령의 전체 경로를 캐시합니다. 실행하려는 명령이 다음 명령으로 해시되었는지 확인할 수 있습니다 type
.
$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)
전체 캐시를 지우려면
$ hash -r
또는 하나의 항목 만 :
$ hash -d svnsync
자세한 내용은 상담 help hash
및 man bash
.
답변
하나의 항목 만 지우려면 다른 플래그가 필요합니다.
hash -d svnsync
-r
플래그는 매개 변수를 사용하지 않고 항상 전체 캐시를 삭제합니다.
(데비안 레니의 bash 3.2.39 이상)
답변
여기에 언급되지 않은 솔루션이 있습니다.
-
set +h
또는로 해싱을 비활성화 할 수 있습니다set +o hashall
help set
말한다 :-h-명령을 실행할 때 명령의 위치를 기억하십시오. 기본적으로 활성화되어 있습니다.
hashall–h와 동일
set -h # enable hashing shopt -u checkhash # disable command existence check hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date date # bash: /some/nonexisting/dir/date: No such file or directory set +h date # normal date output
-
해시 테이블에서 찾은 명령이 실행되기 전에 존재하는지 확인할 수 있습니다.
shopt -s checkhash
help shopt
말한다 :checkhash-설정되면 bash는 해시 테이블에서 찾은 명령이 실행되기 전에 존재하는지 확인합니다. 해시 된 명령이 더 이상 존재하지 않으면 일반 경로 검색이 수행됩니다.
set -h # enable hashing shopt -u checkhash # disable command existence check hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date hash -t date # prints /some/nonexisting/dir/date date # bash: /some/nonexisting/dir/date: No such file or directory shopt -s checkhash # enable command existence check date # normal date output hash -t date # prints /bin/date
-
당신과 경로 이름을 바인딩 할 수 있습니다
hash -p PATH NAME
또는BASH_CMDS[NAME]=PATH
:shopt -u checkhash # disable command existence check hash -p /some/nonexisting/dir/date date date # bash: /some/nonexisting/dir/date: No such file or directory BASH_CMDS[date]=/bin/date date # normal date output
-
마술 :
PATH="$PATH"
공연hash -r
보낸 사람
variables.c
:/* What to do just after the PATH variable has changed. */ void sv_path (name) char *name; { /* hash -r */ phash_flush (); }
시험:
set -h hash -r date hash # prints 1 /bin/date PATH="$PATH" hash # prints hash: hash table empty