Những gì rm rm được băm có nghĩa là gì?


58

Tôi đang xem qua http://mywiki.wooledge.org/BashGuide/CommandsAndArgument và tình cờ thấy điều này:

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a shell builtin

Chỉ sớm hơn một chút, hướng dẫn đã liệt kê các loại lệnh khác nhau được Bash hiểu: bí danh, hàm, hàm dựng, từ khóa và thực thi. Nhưng không có đề cập đến "băm". Vì vậy, trong bối cảnh này, "băm" có nghĩa là gì?

Câu trả lời:


59

Đó là một điều hiệu suất; thay vì tìm kiếm toàn bộ đường dẫn cho nhị phân mỗi lần nó được gọi, nó được đặt vào bảng băm để tra cứu nhanh hơn. Vì vậy, bất kỳ nhị phân nào đã có trong bảng băm này, đều được băm. Nếu bạn di chuyển nhị phân xung quanh khi chúng đã được băm, nó vẫn sẽ cố gắng gọi chúng ở vị trí cũ.

Xem thêm help hash, hoặc man bashtìm kiếm hashtheo các lệnh dựng sẵn ở đó.


15

Như những người khác đã đề cập, hàm băm là một mảng kết hợp (khóa -> giá trị) mà Bash duy trì để khi lệnh được thực thi, Bash tìm kiếm hàm băm này trước để xem vị trí của lệnh trên đĩa đã được tìm thấy chưa $PATHvà được lưu trữ ở đó để tìm kiếm nhanh hơn.

Bạn có thể tải trước hàm băm bằng cách đưa ra một danh sách các lệnh mà bạn muốn Bash tìm thấy khi nó được gọi. Biến này được gọi BASH_CMDS.

đoạn trích từ trang người đàn ông

   BASH_CMDS
          An  associative  array  variable  whose members correspond to the 
          internal hash table of commands as maintained by the hash builtin.
          Elements added to this array appear in the hash table; unsetting 
          array elements cause commands to be removed from the hash table.

Ngoài ra, nếu bạn nhìn vào trang man Bash, có một phần có tiêu đề, THỰC HIỆN THÔNG TIN chi tiết máy trạng thái mà Bash sử dụng khi một lệnh được gõ tại dấu nhắc.

đoạn trích

   If the name is neither a shell function nor a builtin, and contains no 
   slashes, bash searches each element of the PATH for a directory con
   taining an executable file by that name.  Bash uses a hash table to 
   remember the full pathnames of executable files (see hash  under  SHELL
   BUILTIN COMMANDS below).  A full search of the directories in PATH is 
   performed only if the command is not found in the hash table.  If the
   search is unsuccessful, the shell searches for a defined shell function 
   named command_not_found_handle.  If that  function  exists,  it  is
   invoked  with  the  original command and the original command's arguments 
   as its arguments, and the function's exit status becomes the exit
   status of the shell.  If that function is not defined, the shell prints 
   an error message and returns an exit status of 127.

Bạn có thể tìm hiểu những gì hiện tại trong hàm băm của bạn bằng cách sử dụng công -ltắc.

Thí dụ

$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls

rất hữu ích cảm ơn bạn. Trong khi tôi đang làm việc với một kịch bản, tôi thấy điều này băm cản trở. Có cách nào để vô hiệu hóa hoặc xóa điều này?
qodeninja

10

hash là một vỏ Bash tích hợp sẵn cung cấp băm cho các lệnh.

hash [-lr] [-p filename] [-dt] [name]

Thẳng từ miệng ngựa:

help hash

Ghi nhớ hoặc hiển thị vị trí chương trình.

info Bash → Các lệnh dựng sẵn Shell → Các chuỗi vỏ Bourne

Hãy nhớ tên đường dẫn đầy đủ của các lệnh được chỉ định làm đối số NAME, vì vậy chúng không cần phải được tìm kiếm trong các lần gọi tiếp theo. Các lệnh được tìm thấy bằng cách tìm kiếm thông qua các thư mục được liệt kê trong $PATH. Các -ptùy chọn ức chế sự tìm kiếm con đường, và FILENAME được sử dụng như vị trí của NAME. Các -rtùy chọn làm cho vỏ quên mọi vị trí nhớ. Các -dtùy chọn làm cho vỏ để quên đi vị trí nhớ của mỗi TÊN. Nếu -ttùy chọn được cung cấp, tên đường dẫn đầy đủ mà mỗi TÊN tương ứng sẽ được in. Nếu nhiều đối số NAME được cung cấp cùng với -tNAME được in trước tên đường dẫn đầy đủ được băm. Các -ltùy chọn gây ra sẽ được hiển thị trong một định dạng có thể được tái sử dụng làm đầu vào. Nếu không có đối số được đưa ra, hoặc nếu chỉ-lđược cung cấp, thông tin về các lệnh đã nhớ được in. Trạng thái trả về bằng 0 trừ khi không tìm thấy NAME hoặc tùy chọn không hợp lệ được cung cấp.

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.