前言
hash表,一个对用户执行的命令进行记录的信息表,有点像是缓存,便于系统后续能快速地调出相应命令。
一、简介
当刚开机时,hash表为空,每当执行过一条命令时,hash表就会记录下这条命令的路径,相当于缓存。
每个shell中hash表各自独立,即每当新开一个shell时,其hash表均为空,只有执行过命令后,hash表才会开始记录下这些命令的路径,包括这些命令的命中次数。
[root@asdfv ~]# hash
hits command
1 /usr/bin/ls
1 /usr/bin/clear
第一次执行命令时shell解释器会默认从PATH环境变量的路径下寻找该命令的路径。
当第二次使用该命令时,解释器首先会查看hash表,没有该命令才会去PATH路径下查找。
hash表的主要作用:提高命令的调用效率。
二、常用选项
-l 显示hash表内容
-r 清除hash表
-d 删除表中某一条
-p 给定命令全路径,并起别名
-t 查看hash表中特定别名对应命令的路径
参数-l
,会显示hash表中详细内容,包括命令的路径以及别名:
[root@asdfv ~]# hash
hits command
1 /usr/bin/ping
4 /usr/bin/pgrep
# 参数-l,会显示包括shell的builtin命令hash、-p选项、命令的路径以及别名
[root@asdfv ~]# hash -l
builtin hash -p /usr/bin/ping ping
builtin hash -p /usr/bin/pgrep pgrep
清除hash表:
[root@asdfv ~]# hash -r
[root@asdfv ~]# hash
hash: hash table empty
清除完hash表之后,这边来给hash表手动添加一条记录。
使用-p
选项,后跟命令的绝对路径,以及该命令的别名(这边取了bbs
):
[root@asdfv ~]# hash -l
hash: hash table empty
# hash表中添加一条命令,且取别名为bbs
[root@asdfv ~]# hash -p /bin/ls bbs
[root@asdfv ~]# hash -l
builtin hash -p /bin/ls bbs
此时可通过别名(bbs
)执行对应的命令(ls
):
[root@asdfv ~]# bbs
anaconda-ks.cfg influxdb2-client-2.3.0-linux-amd64.tar.gz
ana.tar.xz pwd.txt
b.txt swap_file
customISO tardic
grafana-7.5.12-1.x86_64.rpm telegraf-1.21.2-1.x86_64.rpm
influxdb2-2.1.1.x86_64.rpm test-alias.txt
influxdb2-client-2.3.0-linux-amd64
查询hash表中别名为bbs
的命令全路径:
[root@asdfv ~]# hash -t bbs
/bin/ls
# 根据别名df未找到未找到对应的命令,因为hash表里没有该条记录
[root@asdfv ~]# hash -t df
-bash: hash: df: not found
清除hash表中指定别名对应的命令:
[root@asdfv ~]# hash -l
builtin hash -p /bin/ls bbs
[root@asdfv ~]# hash
hits command
2 /bin/ls
# 清除hash表中指定别名对应的命令
[root@asdfv ~]# hash -d bbs
[root@asdfv ~]# hash -l
hash: hash table empty
[root@asdfv ~]# hash
hash: hash table empty