Bashの実行可能ファイルパスキャッシュを消去する方法は?

Bashの実行可能ファイルパスキャッシュを消去する方法は?

実行可能ファイルへのフルパスを指定せずにプログラムを実行すると、$PATHBashはバイナリを見つけるためにディレクトリを検索する必要があります。たとえば、ソースからSubversionバージョンをインストールしてから、/usr/localBashプロンプトに入力しました。svnsync helpBashは「svnsync」のバイナリを見つけて/usr/local/bin/svnsync実行します。その後、Subversionのインストールを削除し/usr/localて再実行すると、svnsync helpBashが応答します。

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

しかし、Bashの新しいインスタンスを起動すると/usr/bin/svnsync

実行可能ファイルパスのキャッシュを消去する方法は?

答え1

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

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

キャッシュ全体を消去するには:

$ hash -r

または1つのアイテムのみを使用してください。

$ hash -d svnsync

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

答え2

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

  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 NAMEPATHでNAMEを使用またはバインドできます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
    

答え3

1つのアイテムだけを消去するには別のフラグが必要です。

hash -d svnsync

この-rフラグはパラメータを使用せず、常にキャッシュ全体を破棄します。
(少なくともDebian Lennyのbash 3.2.39では)

答え4

ユーザーとしてジョンテックスコメントとして指摘する回答ユーザー別東武、Bashで最も簡単な実際の作業は、プログラムを再ハッシュすることです。

hash svnsync

それはすべてです。

関連情報