Bash의 실행 파일 경로 캐시를 지우려면 어떻게해야합니까?


256

실행 파일의 전체 경로를 지정하지 않고 프로그램을 실행하고 Bash가 $PATH바이너리를 찾기 위해 디렉토리를 검색 해야하는 경우 Bash는 일종의 캐시에서 경로를 기억하는 것으로 보입니다. 예를 들어 source에서 Subversion 빌드를 설치 한 /usr/local다음 svnsync helpBash 프롬프트에 입력 했습니다. 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합니다.

실행 파일 경로 캐시를 지우려면 어떻게해야합니까?


7
사상 최고의 기능
Romeno

답변:


322

bash명령의 전체 경로를 캐시합니다. 실행하려는 명령이 다음 명령으로 해시되었는지 확인할 수 있습니다 type.

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

전체 캐시를 지우려면

$ hash -r

또는 하나의 항목 만 :

$ hash -d svnsync

자세한 내용은 상담 help hashman bash.


15
@Daniel bash에서 "type command " 명령을 사용하여 어떤 유형의 명령인지 확인할 수 있습니다. 명령이 해시되면 "type"이 알려줍니다. 쉘 내장인지 별명인지를 알려주는 것도 유용합니다.
lunchmeat317317 년

4
참고로 캐시 된 PATH를 실행중인 경우 변경 csh하려면 명령은 rehash입니다.
kurtm

위의 rehash명령도 작동합니다 zsh.
닐 트래 프트


4
하나의 명령에서 선택적 리 해싱이에 의해 호출 될 수 있습니다 hash svnsync.
Ioannis Filippidis

25

하나의 항목 만 지우려면 다른 플래그가 필요합니다.

hash -d svnsync

-r플래그는 매개 변수를 사용하지 않고 항상 전체 캐시를 삭제합니다.
(데비안 레니의 bash 3.2.39 이상)


20

여기에 언급되지 않은 솔루션이 있습니다.

  1. 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
    
  2. 해시 테이블에서 찾은 명령이 실행되기 전에 존재하는지 확인할 수 있습니다. 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
    
  3. 당신과 경로 이름을 바인딩 할 수 있습니다 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
    
  4. 마술 : 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
    

1
PATH = $ PATH가 제대로 작동 할 때 모든 추가 메커니즘이 제공되는 이유를 이해하지 못했습니다. PATH가 변경되면 PATH 조회 캐시가 무효화되어야합니다. 맞는 말이다.
jrw32982

PATH가 변경 될 때 캐시가 무효화되어 유스 케이스가 처리되지 않으면 실행 파일의 위치가 변경됩니다. 쉘을 사용하여 프로그램을 추가하거나 제거 할 때, 프로그램을 찾은 마지막 위치 만 캐시하도록 할 때 일반적입니다.
Adam

명령 해시 테이블을 사용하는 것은 bash 스크립트를 디버깅하려는 사람을 혼동시키는 훌륭한 방법입니다.
Erik Aronesty

4

사용자로 johntex이 받는 코멘트에서 언급 한 대답 사용자가 토부 , 배쉬에서 간단한 실제 행동은 당신의 프로그램을 재탕하는 것입니다 :

hash svnsync

그게 다야.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.