私の「どの」コマンドが(時々)間違っている可能性がありますか?

私の「どの」コマンドが(時々)間違っている可能性がありますか?

私のコンピュータにインストールされたバージョンが私にとって(むしろ)古いので、ソース(v24.2)から最後のemacsバージョンをコンパイルしました(v21.3)。私はいつものようにしました:

$configure --prefix=$HOME
make 
make install

今私はemacsをテストしており、まだ古いバージョンを起動していることに気づきました。一方、私の$HOME/binパスはシステムパスよりも優先されます(私の.bashrcファイルの前に$ PATHに追加されたため)。

which私の最初の考えは、コマンド出力を見ることでした。驚くべきことに、これは新しいemacsへのパスを提供します。違いが何なのかわかりません。同じセッションでは、以下は別の結果です。

$ emacs --version
GNU Emacs 21.3.1

$ `which emacs` --version
GNU Emacs 24.2.1

私はemacsエイリアスを扱っていません。絶対にしないでください。

$ alias | grep emacs
$

何が起こったのか知っていますか?

ベストアンサー1

心の中に浮かぶ3つの可能性:

  • エイリアスが存在するemacs(確認済み)
  • 機能がありますemacs
  • 新しいemacsバイナリはシェルのPATHハッシュテーブルにはありません。

次の機能があるかどうかを確認できますemacs

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

削除してください。

unset -f emacs

シェルには、PATHのすべてのバイナリへの参照を含むPATHハッシュテーブルもあります。 PATHの他の場所に既存のバイナリと同じ名前の新しいバイナリを追加する場合は、ハッシュテーブルを更新してシェルに通知する必要があります。

hash -r

その他の注意:

whichbash 組み込み機能ではないため、この機能についてはわかりません。

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

おすすめ記事