Bạn có thể có một bộ PATH dài và, để tìm một tệp thực thi, trình bao cần tìm kiếm đường dẫn. Để tránh quá trình tốn thời gian đó mỗi khi bạn muốn chạy một chương trình, trình bao có thể giữ một danh sách các chương trình mà nó đã tìm thấy. Danh sách đó được gọi là "băm." Khi shell nói rằng nó which
được băm, điều đó có nghĩa là nó đã thực hiện tìm kiếm PATH và tìm thấy which
và lưu vị trí của nó trong hàm băm.
man bash
giải thích nó như sau:
Bash sử dụng bảng băm để ghi nhớ tên đường dẫn đầy đủ của các tệp thực thi (xem hàm băm dưới SHELL BUILTIN THÔNG TIN bên dưới). Một tìm kiếm đầy đủ của các thư mục trong PATH chỉ được thực hiện nếu không tìm thấy lệnh trong bảng băm.
Mặc dù hàm băm thường tăng tốc hoạt động của vỏ, có một trường hợp gây ra sự cố. Nếu bạn cập nhật hệ thống của mình và do đó, một số di chuyển thực thi đến một vị trí mới, trình bao có thể bị nhầm lẫn. Giải pháp là chạy hash -r
khiến cho vỏ bị quên tất cả các vị trí được băm và tìm kiếm PATH từ đầu.
Tại sao một số thực thi bị thiếu từ hàm băm?
Một tệp thực thi không được đặt trong hàm băm cho đến sau khi bạn thực thi ít nhất một lần. Quan sát:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python
chỉ được băm sau khi nó được thực thi.
Làm thế nào để kiểm tra những gì trong bash của bash
Nội dung của hàm băm có sẵn trong bash
mảng BASH_CMDS
. Bạn có thể thấy những gì trong đó với lệnh declare -p BASH_CMDS
. Khi một shell hoặc subshell mới được mở, hàm băm trống. Các lệnh được thêm từng cái một khi chúng được sử dụng. Từ một vỏ mới mở, quan sát:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which
và không chopython
?