shell命令的搜索顺序(hash -r, hash的作用)

我一直以为, shell命令, 比如执行ls, which, less这些, 就是在$PATH或者shell function/builtin中找, 今天才知道还有hash table的存在. 并且hash table搜索先于$PATH. hash table记录了最近的搜索路径, 用hash查看, 得到的是:

hits    command                                                                                       
   1    /usr/bin/which                                                                                
   1    /usr/local/gnubin/stat                                                                        
   8    /usr/bin/man                                                                                  
   3    /usr/local/gnubin/cut                                                                         
   2    /usr/bin/vim                                                                                  
   1    /usr/local/gnubin/ls

这有什么影响呢? 如果之前调用了命令, 保存了搜索路径, 又改了环境变量, 按理说前面那个命令的搜索路径应该被更新, 由于hash table的存在, 就得不到更新. 这几天我就遇到了这个问题. 我装了两个编译器, LLVM和GCC, 默认是GCC, 发现有代码只能用clang编译(既然发现了这一点, 说明我调用了GCC的gcc), 然后我改环境路径, 改完了用which gcc看, 是clang, 但执行的时候, 还是GCC. 就是这个原因. 怎么办? 用hash -r清空hash table

原文地址:https://www.cnblogs.com/Tokubara/p/14408696.html