Bash의 실행 파일 경로 캐시를 지우는 방법은 무엇입니까?

Bash의 실행 파일 경로 캐시를 지우는 방법은 무엇입니까?

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

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

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

  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 NAMEPATH와 함께 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
    

답변3

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

hash -d svnsync

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

답변4

사용자로서존 텍스댓글로 지적해답변사용자별토부, Bash에서 가장 간단한 실제 작업은 프로그램을 다시 해시하는 것입니다.

hash svnsync

그게 다야.

관련 정보