我读过 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
实用程序。set
shopt
source
bash
if
case
for
while
kill
trap
exit
现在我已经足够深刻地理解了两者之间的区别,并谦虚地相信我不会再以这种令人尴尬的方式混淆了。这对我来说是一个重要的教训;我从来没有真正深入研究过什么是 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
。