it-swarm-vi.com

Làm cách nào để xóa bộ nhớ cache của Bash cho các đường dẫn đến tệp thực thi?

Khi tôi thực hiện một chương trình mà không chỉ định đường dẫn đầy đủ đến tệp thực thi và Bash phải tìm kiếm các thư mục trong $PATH để tìm nhị phân, có vẻ như Bash nhớ đường dẫn trong một số loại bộ đệm. Ví dụ: tôi đã cài đặt bản dựng Subversion từ nguồn sang /usr/local, sau đó gõ svnsync help tại Dấu nhắc Bash. Bash định vị nhị phân /usr/local/bin/svnsync cho "svnsync" và thực hiện nó. Sau đó, khi tôi xóa cài đặt Subversion trong /usr/local và chạy lại svnsync help, Bash trả lời:

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

Nhưng, khi tôi bắt đầu một phiên bản mới của Bash, nó tìm thấy và thực thi /usr/bin/svnsync.

Làm cách nào để xóa bộ nhớ cache của đường dẫn đến tệp thực thi?

276
Daniel Trebbien

bash không lưu bộ đệm đường dẫn đầy đủ đến một lệnh. Bạn có thể xác minh rằng lệnh bạn đang cố thực hiện được băm bằng lệnh type:

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

Để xóa toàn bộ bộ đệm:

$ hash -r

Hoặc chỉ một mục:

$ hash -d svnsync

Để biết thêm thông tin, tham khảo ý kiến ​​help hashman bash.

349
Tobu

Để xóa chỉ một mục bạn cần một cờ khác:

hash -d svnsync

Các -r cờ không lấy tham số và sẽ luôn xóa toàn bộ bộ đệm.
[.__.] (Ít nhất là trong bash 3.2,39 trên Debian Lenny)

27
Aryeh Leib Taurog

Có những giải pháp không được đề cập ở đây.

  1. Bạn có thể vô hiệu hóa băm với set +h hoặc là set +o hashall

    help set nói:

    -h - Ghi nhớ vị trí của các lệnh khi chúng được tra cứu để thực thi. Điều này được kích hoạt theo mặc định.

    hashall - Tương tự như -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. Bạn có thể kiểm tra xem một lệnh được tìm thấy trong bảng băm có tồn tại hay không trước khi thử thực thi nó với shopt -s checkhash

    help shopt nói:

    checkhash - Nếu được đặt, bash kiểm tra xem một lệnh được tìm thấy trong bảng băm có tồn tại trước khi thử thực thi nó không. Nếu một lệnh băm không còn tồn tại, tìm kiếm đường dẫn bình thường được thực hiện.

    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. Bạn có thể liên kết TÊN với PATH bằng hash -p PATH NAME hoặc là 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. Ma thuật: PATH="$PATH" thực hiện hash -r

    Từ variables.c :

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }
    

    Thử:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty
    
24
Evgeny Vereshchagin

Là người dùng johntex đã ghi chú trong một nhận xét cho câu trả lời bởi người dùng Tob , hành động thực tế đơn giản nhất trong Bash là chỉ thử lại chương trình của bạn:

hash svnsync

Đó là tất cả.

5
Acumenus