在linux中用户键入命令时敲TAB键的时候,它会去查找以用户所给定的起始字符串或开头字符串在PATH的环境变量所指明的各路径下,自左而右,逐一去搜索是否有一个应用程序的名称被用户给定的字符串打头的字符串唯一进行标示,如果有则把后面剩余的字符进行补全,如果无法唯一被标示,两次TAB列出所有的以此打头的的内容。
而hash命令就是为了缓存此前命令的查找结果!
shell通过环境变量PATH来定义应用程序文件查找路径,shell搜寻到的外部命令的路径结果会缓存至kv(key-value)存储中;
系统在执行外部命令时,会先查看shell的命令hash缓存表,如果存在,就直接使用路径引用;否则,则需要遍历PATH环境变量所指向的目录来查找;
注意:仅对当前shell用户有效
选 项:
-d:删除缓存中的执行的某条命令
-r:删除缓存中的之前执行的命令
用法:当$PATH或命令位置发生改变时,更新hash
root@localhost ~]# mv /usr/bin/ls ~qzx/ [root@localhost ~]# ls -bash: /usr/bin/ls: 没有那个文件或目录 [root@localhost ~]# hash -d ls [root@localhost ~]# ls bash: ls: 未找到命令... 相似命令是: ‘lz‘ [root@localhost ~]# mv ~qzx/ls /usr/bin [root@localhost ~]# ls 12345678 anaconda-ks.cfg issue~ 图片 1234567890 asd qzx 文档
这时候就需要通过删除之前寻找的ls命令的路径来更新寻找
PATH决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当需要运行一个程序时,则就在这些目录下进行搜寻编译链接。
通过echo $PATH可以看出
[root@VM_18_121_centos ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
路径通常使用冒号分隔,且查找次序为从左至右;
您也可以自己加上指定的路径,中间用冒号隔开。
[root@localhost ~]# mv /usr/bin/ls ~qzx/ [root@localhost ~]# ls -bash: /usr/bin/ls: 没有那个文件或目录 [root@localhost ~]# export PATH=~qzx/:$PATH [root@localhost ~]# ls 12345678 anaconda-ks.cfg issue~ 图片 1234567890 asd qzx 文档
所以还是建议通过编辑/etc/profile来改PATH,也可以改家目录下的.bashrc(即:~/.bashrc)。
环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句:$source .bash_profile
原文地址:http://11741220.blog.51cto.com/11731220/1832409