我一直以为, 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