it-swarm-ko.tech

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

실행 파일의 전체 경로를 지정하지 않고 프로그램을 실행하고 Bash가 바이너리를 찾기 위해 $PATH에서 디렉토리를 검색해야 할 경우 Bash는 일종의 캐시에서 경로를 기억하는 것 같습니다. 예를 들어, 소스에서 /usr/local로 Subversion 빌드를 설치 한 다음 Bash 프롬프트에서 svnsync help를 입력했습니다. Bash는 "svnsync"에 대한 바이너리 /usr/local/bin/svnsync를 찾아서 실행했습니다. 그런 다음 /usr/local에서 Subversion 설치를 삭제하고 svnsync help를 다시 실행하면 Bash가 응답합니다.

bash: /usr/local/bin/svnsync: No such file or directory

그러나 새로운 Bash 인스턴스를 시작하면 /usr/bin/svnsync를 찾아서 실행합니다.

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

276
Daniel Trebbien

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

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

전체 캐시를 지우려면

$ hash -r

또는 하나의 항목 만 :

$ hash -d svnsync

자세한 내용은 help hashman bash.

349
Tobu

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

hash -d svnsync

-r 플래그는 매개 변수를 사용하지 않으며 항상 전체 캐시를 삭제합니다.
(Debian Lenny의 bash 3.2.39 이상)

27
Aryeh Leib Taurog

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

  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를 사용하여 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
    
24

johntex 사용자가 answer 사용자 Tob 에 대한 주석에서 언급 한 것처럼 Bash에서 가장 간단한 실제 조치는 프로그램을 다시 해시하는 것입니다.

hash svnsync

그게 다야.

5
Acumenus