실행 파일의 전체 경로를 지정하지 않고 프로그램을 실행하면 Bash는 바이너리를 찾기 위해 디렉터리를 검색해야 하는데 $PATH
Bash는 일종의 캐시에 경로를 기억하는 것 같습니다. 예를 들어 소스에서 Subversion 버전을 설치한 다음 /usr/local
Bash 프롬프트에 입력했습니다. svnsync help
Bash는 "svnsync"에 대한 바이너리를 찾아서 /usr/local/bin/svnsync
실행합니다. 그런 다음 Subversion 설치를 제거 /usr/local
하고 다시 실행 하면 svnsync help
Bash가 응답합니다.
bash: /usr/local/bin/svnsync: No such file or directory
그러나 Bash의 새 인스턴스를 시작하면 /usr/bin/svnsync
.
실행 파일 경로의 캐시를 지우는 방법은 무엇입니까?
답변1
bash
캐시 명령의 전체 경로입니다. 다음을 사용하여 실행하려는 명령이 해시되었는지 확인할 수 있습니다 type
.
$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)
전체 캐시를 지우려면:
$ hash -r
또는 하나의 항목만 사용하세요.
$ hash -d svnsync
자세한 내용은 help hash
및 를 참조하세요 man bash
.
답변2
여기에 언급되지 않은 솔루션도 있습니다.
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
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
답변3
하나의 항목만 지우려면 다른 플래그가 필요합니다.
hash -d svnsync
이 -r
플래그는 매개변수를 사용하지 않으며 항상 전체 캐시를 삭제합니다.
(적어도 Debian Lenny의 bash 3.2.39에서는)