为什么`键入哪个`说’哪个是哈希?’?

在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" )'