为什么`键入哪个`说’哪个是哈希?’?
在shell-builtins的情况下(例如type
本身):
$ type type type is a shell builtin $ which type
如果是命令(通常)(例如python
):
$ type python python is /usr/bin/python $ which python /usr/bin/python
如果是(这是一个位于/usr/bin/which
的命令)
$ type which which is hashed (/usr/bin/which) $ which which /usr/bin/which
为什么type which
表示which is hashed
? 被散列的意义是什么,它实际意味着什么?
您可能有一个很长的PATH集,并且为了找到可执行文件,shell需要搜索路径。 为了避免每次要运行程序时耗费大量时间,shell可能会保留已找到的程序列表。 该列表称为“哈希”。 当shell说出哈希值时,意味着它已经完成了PATH搜索并找到了which
并将其位置保存在哈希中。
man bash
解释如下:
Bash使用哈希表来记住可执行文件的完整路径名(请参阅下面的SHELL BUILTIN命令下的哈希)。 仅当在哈希表中找不到该命令时,才会执行PATH中目录的完整搜索。
虽然哈希通常会加速shell操作,但有一种情况会导致问题。 如果您更新系统,并因此将某些可执行文件移动到新位置,则shell可能会混淆。 解决方案是运行hash -r
,这会导致shell忘记所有散列位置并从头开始搜索PATH。
为什么哈希中缺少一些可执行文件?
在执行至少一次之后,可执行文件不会放在哈希中。 注意:
$ type python python is /usr/bin/python $ python --version Python 2.7.3 $ type python python is hashed (/usr/bin/python)
python
只有在执行后才会进行哈希处理。
如何检查bash哈希中的内容
哈希的内容在bash
数组BASH_CMDS
中可用。 您可以使用命令declare -p BASH_CMDS
。 打开新的shell或子shell时,哈希为空。 命令在使用时逐个添加。 从新打开的shell中观察:
$ 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" )'