Bash我的
我的 which
命令可能是錯誤的(有時)?
我已經從原始碼(v24.2)編譯了最後一個 emacs 版本,因為安裝在我的機器上的版本對我來說(相當)舊(v21.3)。我已經做了通常的:
$configure --prefix=$HOME make make install
現在我正在測試 emacs 並意識到它仍然會啟動以前的版本……而我的路徑應該覆蓋系統路徑(因為它在我的文件
$HOME/bin
中添加到 $PATH 之前)。.bashrc
我的第一個想法是查看
which
命令輸出。令人驚訝的是,它提供了通向新 emacs 的途徑。我不明白這裡的差異在哪裡。在同一個會話中,這裡是不同的輸出:$ emacs --version GNU Emacs 21.3.1 $ `which emacs` --version GNU Emacs 24.2.1
我沒有涉及 emacs 的別名。完全沒有。
$ alias | grep emacs $
知道發生了什麼嗎?
我想到的三種可能性:
- 存在別名
emacs
(您已檢查)- 存在一個函式
emacs
- 新的
emacs
二進製文件不在您的 shell 的 PATH 雜湊表中。你可以檢查你是否有一個功能
emacs
:bash-3.2$ declare -F | fgrep emacs declare -f emacs
並刪除它:
unset -f emacs
你的 shell 還有一個 PATH 雜湊表,其中包含對 PATH 中每個二進製文件的引用。如果您在 PATH 中的其他位置添加與現有二進製文件同名的新二進製文件,則需要通過更新雜湊表來通知 shell:
hash -r
補充說明:
which
不了解函式,因為它不是內置的 bash:bash-3.2$ emacs() { echo 'no emacs for you'; } bash-3.2$ emacs no emacs for you bash-3.2$ which emacs /usr/bin/emacs bash-3.2$ `which emacs` --version | head -1 GNU Emacs 22.1.1
此腳本展示了新的二進制雜湊表行為。
bash-3.2$ PATH=$HOME/bin:$PATH bash-3.2$ cd $HOME/bin bash-3.2$ cat nofile cat: nofile: No such file or directory bash-3.2$ echo echo hi > cat bash-3.2$ chmod +x cat bash-3.2$ cat nofile cat: nofile: No such file or directory bash-3.2$ hash -r bash-3.2$ cat nofile hi bash-3.2$ rm cat bash-3.2$ cat nofile bash: /Users/mrb/bin/cat: No such file or directory bash-3.2$ hash -r bash-3.2$ cat nofile cat: nofile: No such file or directory
雖然我沒有呼叫它,
which cat
但總是會在我的 PATH 中返回第一個cat
,因為它不使用 shell 的雜湊表。