“ rm被散列”是什么意思?


58

我正在浏览http://mywiki.wooledge.org/BashGuide/CommandsAndArguments并遇到以下问题:

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

不久之前,该指南列出了Bash可以理解的各种命令:别名,函数,内建函数,关键字和可执行文件。但是没有提到“散列”。那么,在这种情况下,“散列”是什么意思?

Answers:


59

这是一种表现力;而不是在每次调用二进制文件时都在整个路径中搜索二进制文件,而是将其放入哈希表中以加快查找速度。因此,哈希表中已经存在的任何二进制文件都将被哈希化。如果您在二进制文件已经散列后移动它们,它将仍然尝试在其旧位置调用它们。

另请参阅help hash,或在man bash其中搜索hash内置命令。


15

正如其他人提到的那样,哈希是Bash维护的关联数组(键->值),以便在执行命令时,Bash首先搜索该哈希,以查看是否已经通过$PATH,找到了并存储了该命令在磁盘上的位置。快速搜索。

您可以通过提供希望Bash在调用时查找的命令列表来预加载该哈希。此变量称为BASH_CMDS

手册页摘录

   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.

另外,如果您查看Bash手册页,则有一个标题为COMMAND EXECUTION的部分,其中详细说明了在提示符下键入命令时Bash使用的状态机。

摘抄

   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.

您可以使用该-l开关找出当前哈希中的内容。

$ 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

非常有帮助,谢谢。在编写脚本时,我发现此哈希值妨碍了操作。有没有办法禁用或清除此?
qodeninja

10

hash 是内置的Bash Shell,可为命令提供哈希。

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

从马口直行:

help hash

记住或显示程序位置。

info Bash →Shell内置命令→Bourne Shell内置

请记住,指定为NAME参数的命令的完整路径名,因此无需在后续调用中搜索它们。通过搜索中列出的目录可以找到命令$PATH。该-p选项禁止路径搜索,并且FILENAME用作NAME的位置。该-r选项使外壳程序忘记所有记住的位置。该-d选项使外壳程序忘记每个NAME的记住位置。如果-t提供了该选项,则将打印每个名称对应的完整路径名。如果提供了多个NAME参数,则-t在散列的完整路径名之前打印NAME。该-l选项使输出以可以重新用作输入的格式显示。如果没有给出参数,或者仅-l提供时,将打印有关记住的命令的信息。除非找不到名称或提供了无效的选项,否则返回状态为零。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.