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