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

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

私のコンピュータにインストールされたバージョンが私にとって(むしろ)古いので、ソース(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

答え2

はい、どちらを使用してはいけませんか?:

  • 一部のシステムでは、変更を読み取ることができるcshスクリプトで実装された外部コマンドですPATH
  • 組み込みの機能があります。 2つの偶数:typecommand。 POSIX方式:

    command -v emacs       # machine-readable format
    type emacs             # human-only format
    

    Bashでは、type -p emacs外部コマンドのパスだけを見ることもできます。

しかし、ここではwhich実際に正しいです。 Bash は、次に命令をより早く実行できるように、メモリ内の命令の位置に関する情報を保持します。emacsに新しい実行可能ファイルをインストールしましたが、古いPATH場所はbashのキャッシュに残ります。hash emacs検索をやり直すemacsか、hash -rキャッシュを削除してください。

答え3

ログアウトしてログインすると、更新された.bashrcログインファイルが再度読み取られますか?それ以外の場合は、現在のセッション環境が更新されていません。

関連情報