実行可能ファイルへのパスのBashのキャッシュをクリアするにはどうすればよいですか?


256

実行可能ファイルへのフルパスを指定せずにプログラムを実行し、Bashがディレクトリ$PATHを検索してバイナリを見つける必要がある場合、Bashは何らかのキャッシュ内のパスを記憶しているようです。例えば、私がするソースからのSubversionのビルドをインストールし/usr/local、その後、入力されたsvnsync helpbashプロンプトで。Bash /usr/local/bin/svnsyncは「svnsync」のバイナリを見つけて実行しました。次に、Subversionのインストールを削除し/usr/localて再実行するとsvnsync help、Bashが応答します。

bash: /usr/local/bin/svnsync: No such file or directory

しかし、Bashの新しいインスタンスを起動すると、が検出されて実行され/usr/bin/svnsyncます。

実行可能ファイルへのパスのキャッシュをクリアするにはどうすればよいですか?


7
これまでstupidiest機能
Romenoの

回答:


322

bashコマンドへのフルパスをキャッシュします。コマンドを使用して、実行しようとしているtypeコマンドがハッシュされていることを確認できます。

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

キャッシュ全体をクリアするには:

$ hash -r

または、1つのエントリのみ:

$ hash -d svnsync

詳細については、help hashおよびを参照してくださいman bash


15
@Daniel bashでは、コマンド "type command "を使用して、それがどのタイプのコマンドであるかを調べることができます。コマンドがハッシュされている場合、 "type"が表示されます。また、何かがシェルのビルトインであるかエイリアスであるかを知ることも有用です。
lunchmeat317

4
参考までに、実行中cshにキャッシュされたPATHを変更する場合、コマンドはrehashです。
kurtm

上記のrehashコマンドはにも機能しzshます。
ニールトラフト


4
あるコマンドでは、によって選択的再ハッシュを呼び出すことができますhash svnsync
イオアニスフィリピディス14

25

1つのエントリのみをクリアするには、異なるフラグが必要です。

hash -d svnsync

-rフラグは、パラメータを取らないと、常に全体のキャッシュを削除します。
(少なくともDebian Lennyのbash 3.2.39では)


20

ここで言及されていない解決策があります。

  1. set +hまたはでハッシュを無効にできますset +o hashall

    help set 言う:

    -h-実行のために検索されるコマンドの場所を記憶します。これはデフォルトで有効になっています。

    hashall--hと同じ

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    set +h
    date # normal date output
  2. 次のコマンドを実行する前に、ハッシュテーブルで見つかったコマンドが存在することを確認できます。 shopt -s checkhash

    help shopt 言う:

    checkhash-設定されている場合、bashはハッシュテーブルで見つかったコマンドが実行される前に存在することを確認します。ハッシュされたコマンドがもう存在しない場合、通常のパス検索が実行されます。

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    hash -t date # prints /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    shopt -s checkhash # enable command existence check
    date # normal date output
    hash -t date # prints /bin/date
  3. hash -p PATH NAMEまたはを使用して、NAMEをPATHにバインドできますBASH_CMDS[NAME]=PATH

    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    BASH_CMDS[date]=/bin/date
    date # normal date output
  4. マジック:PATH="$PATH"実行hash -r

    からvariables.c

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }

    試してください:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty

1
PATH = $ PATHが正常に機能するときに、余分なメカニズムがすべて提供される理由を理解したことはありません。PATHが変更された場合、PATHルックアップキャッシュを無効にする必要があります。理にかなっています。
jrw32982

PATHが変更されたときにキャッシュを無効にすることで処理されないユースケースは、実行可能ファイルの場所が変更された場合です。これは、シェルを使用してプログラムを追加または削除し、最後に見つかった場所をキャッシュするだけの場合によくあることです。
アダム

コマンドハッシュテーブルをいじることは、bashスクリプトをデバッグしようとしている人を本当に混乱させるすばらしい方法です。
エリックアロネスティ

4

ユーザーとしてjohntexがにコメントで指摘している答えは、ユーザーが東部、バッシュで最も簡単な具体的な行動は自分のプログラムを焼き直しすることです:

hash svnsync

それで全部です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.