Bash内置哈希和命令搜索

时间:2015-01-20 12:51:21

标签: linux bash shell hash

键入命令时会发生什么,并且它不被识别为内部命令之一? 你得到的通常答案是bash会从搜索路径中寻找它。即使是最近的专业教科书也能为您提供答案。不幸的是,事实并非如此。 Bash将首先检查其自己的内置哈希表以进行匹配,如果没有匹配则读取搜索路径内容并将找到可执行文件的路径添加到哈希表中。首先使用哈希表的想法是避免重复搜索路径,从而加快速度。但是,正如我们接下来在测试中看到的那样,它可能会导致奇怪的情况 我们可以通过命令查看当前的哈希值:

hash
hash: hash table empty

如果刚打开终端,你会看到答案。

让我们运行“日期”再看一遍:

date
Tue Jan 20 14:13:42 AST 2015
hash
hits    command
1   /bin/date

到目前为止一切正常。我们现在将“约会”移动到另一个位置。我们选择搜索路径中的目的地:

sudo mv /bin/date /usr/bin/date

让我们检查一下,我们仍然可以运行“日期”,因为位置在搜索路径中,所以应该找到它:

date
bash: /bin/date: No such file or directory

糟糕。当哈希表搜索产生路径(现在无效)时,Bash根本不会尝试从搜索路径中找到。

功能描述于 Bash Reference Manual

您可以手动强制“哈希”重新加载“日期”的新位置

hash date

一切都很好。

为什么当哈希表返回可执行文件的无效路径时,bash无法在$PATH进行搜索?

2 个答案:

答案 0 :(得分:0)

  

为什么当哈希表返回可执行文件的无效路径时,bash无法在$ PATH上搜索?

这是因为bash仅在命令成功时才在hash表中添加条目。

如果你早点得到它:

hash
hits  command
1     /bin/date

然后运行类似:

qwerty
-bash: qwerty: command not found

由于未找到qwerty命令,因此不会将其添加到hash表中。如果再次运行hash,您仍会获得:

hash
hits  command
1     /bin/date

表格中未添加qwerty条目。所以bash shell假设如果一个条目在hash表中可用(它只是一个缓存),则可以使用该hash条目再次运行该二进制文件并{{1不会被搜查。

答案 1 :(得分:0)

这就是Bash目前的设计方式。在该情况下将显示错误消息,而不是尝试在搜索路径$ PATH中查找可执行文件。