実行可能ファイルへのフルパスを指定せずにプログラムを実行し、Bashが$PATH
内のディレクトリを検索してバイナリを見つける必要がある場合、Bashはある種のキャッシュでパスを記憶しているようです。たとえば、Subversionのビルドをソースから/usr/local
にインストールし、Bashプロンプトでsvnsync help
と入力しました。 Bashは「svnsync」のバイナリ/usr/local/bin/svnsync
を見つけて実行しました。次に、/usr/local
のSubversionのインストールを削除してsvnsync help
を再実行すると、Bashが応答します。
bash: /usr/local/bin/svnsync: No such file or directory
しかし、Bashの新しいインスタンスを開始すると、/usr/bin/svnsync
が検出されて実行されます。
実行可能ファイルへのパスのキャッシュをクリアするにはどうすればよいですか?
bash
は、コマンドへの完全パスをキャッシュします。実行しようとしているコマンドがtype
コマンドでハッシュされていることを確認できます。
$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)
キャッシュ全体をクリアするには:
$ hash -r
または、ただ1つのエントリ:
$ hash -d svnsync
詳細については、help hash
およびman bash
をご覧ください。
1つのエントリだけをクリアするには、別のフラグが必要です。
hash -d svnsync
-r
フラグはパラメーターをとらず、常にキャッシュ全体を削除します。
(少なくともDebian Lennyのbash 3.2.39で)
ここで言及されていない解決策があります。
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
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
NAMEをhash -p PATH NAME
またはBASH_CMDS[NAME]=PATH
で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
マジック: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