为什么要维护 PATH 目录的内部表?

Laz*_*zer 1 linux shell shell-script hashing

我正在寻找rehash命令的作用并找到了这个

rehash 命令重新计算路径环境变量中列出的目录内容的内部哈希表,以说明添加的新命令。

我从来不知道任何内部哈希表。为什么以及如何维护它们?

Kev*_*nko 5

当您输入命令时,如果没有哈希表,shell 将检查$PATH变量中列出的每个目录,以查看是否在那里找到您的命令。

如果这些目录中的任何一个连接到慢速设备,这可能是一个缓慢的过程。每次输入命令时都会暂停。

因此,当 shell 开始运行时,它会读取其中的每个目录$PATH并确定所有可执行程序是什么,然后将此列表存储到内存中的哈希表中。然后,它就不需要再次检查它们,它可以快速知道您键入的命令是否有效。

只要您从不添加或删除程序,这就会很好地工作,因为一旦您这样做,哈希表就会过时。该rehash命令的目的是要求 shell 再次读取程序列表。

以上适用于cshtcsh

使用bashshell,它不会在启动时读入所有程序的名称。它确实保留了一个哈希表,但它只会在您键入命令时将内容放入其中。例如:

bash-3.2$ ls
foo bar baz
bash-3.2$ cp
cp: missing file operand
Try `cp --help' for more information.
bash-3.2$ hash
hits    command
   1    /bin/cp
   1    /bin/ls
Run Code Online (Sandbox Code Playgroud)

它记住了cpls命令的位置。