hash 没有显示 Bash 命令列表

hash 没有显示 Bash 命令列表

我读过 O'reilly Bash 的书(第三版,2005 年)我理解的因为如果我执行,hash我将看到一个“哈希表”,其中列出了所有可能的 Bash 命令以及我的系统中可用的大多数环境(包括 Bash)中通用的所有命令。

然而在 WSL-Ubuntu (16.04 - xenial) 中我执行hash并得到了:

hits    command
   1    /usr/bin/mesg

这可能是 WSL 独有的(我现在没有非 WSL 的 Ubuntu 机器可以测试)?

更新

我误解了这一章——哈希表并不包含所有的 Bash 命令,但似乎所有最近使用的非 bash 命令(包含其数据的文件的路径);

只是作者给出了一个列表,其中包含一些很常见我快速浏览列表时错误地将一些命令混淆为“内置”,尽管它们是独立的实用程序(这是书中第 72 页的列表):

cat
stat
less
man
apropos
more
ln
ls
ps
vi

当然,这些不是 Bash 内置命令,如、、、、、、、、、、、、、、等,而是cd基于Bash 的环境中非常常见的独立echo实用程序。setshoptsourcebashifcaseforwhilekilltrapexit

现在我已经足够深刻地理解了两者之间的区别,并谦虚地相信我不会再以这种令人尴尬的方式混淆了。这对我来说是一个重要的教训;我从来没有真正深入研究过什么是 Bash 内置的非常常见的程序,以及在基于 Bash 的环境中可能被理解为“内置”的“非常常见的”实用程序之间的区别,但我的立场是 - “不再如此!”。

答案1

如图help hash所示,该hash函数用于确定并记住程序的完整路径名:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
    Remember or display program locations.

    Determine and remember the full pathname of each command NAME.  If
    no arguments are given, information about remembered commands is displayed.

    Options:
      -d        forget the remembered location of each NAME
      -l        display in a format that may be reused as input
      -p pathname       use PATHNAME as the full pathname of NAME
      -r        forget all remembered locations
      -t        print the remembered location of each NAME, preceding
                each location with the corresponding NAME if multiple
                NAMEs are given
    Arguments:
      NAME      Each NAME is searched for in $PATH and added to the list
                of remembered commands.

    Exit Status:
    Returns success unless NAME is not found or an invalid option is given.

在您的情况下它会返回,/usr/bin/mesg因为显然mesg之前已被调用并且hash现在记住了它的路径。

要获取有关bash内置命令、函数等的帮助,可以使用该help函数。无需参数即可调用该函数以获取内部定义的 shell 命令列表。要获取内置命令列表,bash您可以使用compgen -b

相关内容