我在 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
, echo
, set
, shopt
, source
, bash
, if
, case
, for
, while
, kill
, trap
, exit
, 等,而是在基于 Bash 的环境中非常常见的独立实用程序。
到目前为止,我已经将这种差异内化得足够深,并且谦卑地相信我不会再以这种尴尬的方式混淆。这对我来说是重要的一课;我从来没有真正深入研究过非常常见的程序是 Bash 内置程序还是在基于 Bash 的环境中可能被理解为“内置”的“非常常见”实用程序之间的差异,但我的立场是 - “不再有!”。
如图
help hash
所示,该hash
函数用于确定和记住程序的完整路径名:在您的情况下,它会返回
/usr/bin/mesg
,因为显然mesg
之前已经调用过并且hash
现在记住了它的路径。要获得有关
bash
内置函数、函数等的帮助,有help
函数。不带参数调用它以获取内部定义的 shell 命令列表。要获取内置列表,bash
您可以使用compgen -b
.