Bash

我的 which 命令可能是錯誤的(有時)?

  • September 14, 2012

我已經從原始碼(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 的雜湊表。

引用自:https://unix.stackexchange.com/questions/47363