Vô hiệu hóa bộ đệm của bash của các tệp thực thi trong đường dẫn


12

Lưu ý rằng đây không phải là một bản sao. Tôi đang hỏi về việc vô hiệu hóa bộ đệm, không xóa nó. Nếu bạn có một bộ đệm để xóa, thì rõ ràng nó không bị vô hiệu hóa.

Trong những dịp hiếm hoi tôi nhận thấy bộ nhớ cache của bash những thứ mà nó tìm thấy trên đường dẫn, không phải vì nó hữu ích, mà là vì nó gây khó chịu. Một ví dụ:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

Trong một vỏ khác ...

~ dc$ which which
/usr/bin/which

Tôi chắc chắn rằng bộ nhớ đệm này có ý nghĩa trở lại vào thời xa xưa khi các đĩa bị chậm và bộ nhớ đắt và bị hạn chế và do đó bạn không thể lưu trữ nhiều bộ đệm - lưu trữ một đường dẫn rẻ hơn so với lưu trữ tất cả các khối đĩa cần thiết để tìm lệnh . Nhưng những ngày này nó không mang lại lợi ích đáng chú ý nào và gây ra nhiều vấn đề hơn nó giải quyết. Đó là một hành vi sai trái, verging là một lỗi.

Và tôi thậm chí không thể tìm ra cách để vô hiệu hóa nó. Bất kỳ con trỏ?


1
Những lợi ích là đáng chú ý ngay cả trong trường hợp phổ biến của máy tính để bàn, nếu bạn không có quá nhiều RAM /usr/binvẫn hoàn toàn trong bộ nhớ cache.
Gilles 'SO- ngừng trở nên xấu xa'

1
@drhyde, xin lỗi. Tôi đánh dấu câu hỏi này là trùng lặp. Sử dụng set +hđể vô hiệu hóa băm.
Evgeny Vereshchagin

Trong Nixos, nó đã vô hiệu hóa hàm băm trong bash của nó. Tôi nghĩ, vì một lý do tốt vì cách làm việc của Nixos. Tuy nhiên, tôi không chắc chắn nếu điều này thực sự bắt buộc đối với Nixos. Tôi chỉ nói rằng, một hàm băm trong bash có thể mang lại vấn đề trong một số tình huống nhất định.
typelogic

Câu trả lời:


12

Bạn chỉ có thể xóa các tệp thực thi được băm trước khi lời nhắc được rút ra:

PROMPT_COMMAND='hash -r'

Từ help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.


1
@EvgenyVereshchagin set +hkhông lý tưởng, vì nhiều tiện ích (ví dụ như cài đặt đá quý ruby) gọi hash, tạo ra các luồng -bash: hash: hashing disabledcảnh báo.
David Moles

Tôi cũng thấy các thông báo cảnh báo tương tự trong một kích hoạt virtualenv python. Nhưng tôi nghĩ, nó vô hại.
typelogic

8

Bạn có thể buộc bash thực hiện tra cứu đường dẫn mới trong trường hợp lệnh trong bảng băm không còn tồn tại nữa.

shopt -s checkhash

Từ trang của bash:

kiểm tra lại

    Nếu được đặt, bash sẽ 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ó. 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.

Thí dụ:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
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.