私のコンピュータにインストールされたバージョンが私にとって(むしろ)古いので、ソース(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
答え2
はい、どちらを使用してはいけませんか?:
- 一部のシステムでは、変更を読み取ることができるcshスクリプトで実装された外部コマンドです
PATH
。 組み込みの機能があります。 2つの偶数:
type
とcommand
。 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
ログインファイルが再度読み取られますか?それ以外の場合は、現在のセッション環境が更新されていません。