hash是记住或者显示应用程序位置的命令,也是系统加速命令执行的一种机制,hash是bash内建的命令,可以使用help hash来查看帮助:

hash [-lr] [-p pathname] [-dt] [name ...]

   Options:

     -d            #忘掉记住的每个NAME的位置

     -l            #以可再用作输入的格式来显示

     -p pathname   #使用path那么是一个完全的路径名

     -r            #忘掉所有记住的位置

     -t            #打印出每个记住的NAME的位置,但是如果结果给出来多个的话首先检查位置是否正确

[root@Wiker ~]# type touch
touch is /bin/touch
[root@Wiker ~]# touch test1
[root@Wiker ~]# type touch
touch is hashed (/bin/touch)

  从上面我们可以看出来,当我们执行完一个命令以后系统会自动的把这个执行的命令位置信息加入到hash缓存里面下次执行的时候就直接从缓存中寻找此位置执行。可以使用hash查看当前缓存中的命令有哪些,以及一些命令的命中次数

[root@Wiker ~]# hash
hits    command
   3    /bin/touch
   1    /bin/mv
   1    /usr/bin/man
   2    /bin/ls
   1    /bin/su
   1    /usr/bin/clear

我们把touch命令移动到/sbin目录下,然后再执行一次touch命令

[root@Wiker ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Wiker ~]# mv /bin/touch /sbin/
[root@Wiker ~]# touch test2  
-bash: /bin/touch: No such file or directory

  为什么会出现错误呢?明明PATH变量中声明了/sbin。可以从上面实验看出,系统查找touch命令的位置还是之前的/bin/touch,从这点就可以看出来,命令初次执行的时候系统会把此命令的位置信息缓存到hash缓存里面,下次再执行的时候就会直接在hash缓存中调用此命令的位置然后来执行。可以使用hash -d touch删除hash中的信息,然后再执行的话就可以了,当然相应的位置信息也会发生变化

[root@Wiker ~]# hash -d touch
[root@Wiker ~]# touch test3
[root@Wiker ~]# ll test3
-rw-r--r--. 1 root root 0 Jan 11 06:32 test3
[root@Wiker ~]# hash
hits    command
   1    /sbin/touch