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