Bash의 실행 파일 경로 캐시를 지우려면 어떻게해야합니까? 했습니다. Bash /usr/local/bin/svnsync는

실행 파일의 전체 경로를 지정하지 않고 프로그램을 실행하고 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합니다.

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



답변

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

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

전체 캐시를 지우려면

$ hash -r

또는 하나의 항목 만 :

$ hash -d svnsync

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


답변

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

hash -d svnsync

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


답변

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

  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
    

답변

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

hash svnsync

그게 다야.


답변