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?


256

Khi tôi thực thi 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 $PATHđể tìm tệp nhị phân, có vẻ như Bash nhớ đường dẫn trong một loại bộ đệm. Ví dụ, tôi đã cài đặt bản dựng Subversion từ nguồn tới /usr/local, sau đó gõ svnsync helpvào dấu nhắc Bash. Bash định vị nhị phân /usr/local/bin/svnsynccho "svnsync" và thực hiện nó. Sau đó, khi tôi xóa cài đặt Subversion /usr/localvà 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?


7
Tính năng đáng kinh ngạc nhất từng có
Romeno

Câu trả lời:


322

bashkhông lưu trữ đườ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 typelệnh:

$ 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.


15
@Daniel Đáng để thêm rằng, trong bash, bạn có thể sử dụng lệnh "type lệnh " để tìm hiểu loại lệnh đó là gì - nếu lệnh của bạn được băm, "type" sẽ cho bạn biết. Nó cũng hữu ích để biết liệu một cái gì đó là vỏ dựng sẵn hay bí danh.
bữa ăn trưa317

4
Là một FYI, để thay đổi PATH cache nếu chạy csh, lệnh là rehash.
kurtm

Lệnh trên rehashcũng hoạt động cho zsh.
Neil Traft

Để có câu trả lời đầy đủ hơn, hãy xem unix.stackexchange.com/questions/86012/ory
Ioannis Filippidis

4
Trong một lệnh chọn lọc lại có thể được gọi bằng hash svnsync.
Ioannis Filippidis

25

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

hash -d svnsync

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


20

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 bằng set +hhoặcset +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 NAMEhoặc 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. Phép thuật: PATH="$PATH"biểu diễnhash -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

1
Tôi chưa bao giờ hiểu tại sao tất cả các cơ chế bổ sung được cung cấp khi PATH = $ PATH hoạt động tốt. Nếu PATH thay đổi, thì bộ đệm tra cứu PATH sẽ bị vô hiệu. Có ý nghĩa.
jrw32982

Ca sử dụng không được xử lý bằng cách vô hiệu hóa bộ đệm khi PATH thay đổi là khi vị trí của các tệp thực thi thay đổi. Điều này có thể phổ biến khi bạn đang sử dụng trình bao để thêm hoặc xóa chương trình, chỉ để nó lưu vào vị trí cuối cùng mà nó tìm thấy chúng.
Adam

Lộn xộn với bảng băm lệnh là một cách tuyệt vời để thực sự nhầm lẫn một người đang cố gắng gỡ lỗi một tập lệnh bash.
Erik Aronesty

4

Như người dùng johntex đã ghi chú trong một bình luận cho câu trả lời của người dùng Tobu , 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ả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.