実行可能ファイルへのフルパスを指定せずにプログラムを実行すると、$PATH
Bashはバイナリを見つけるためにディレクトリを検索する必要があります。たとえば、ソースからSubversionバージョンをインストールしてから、/usr/local
Bashプロンプトに入力しました。svnsync help
Bashは「svnsync」のバイナリを見つけて/usr/local/bin/svnsync
実行します。その後、Subversionのインストールを削除し/usr/local
て再実行すると、svnsync help
Bashが応答します。
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
ここで言及されていない解決策もあります。
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
hash -p PATH NAME
PATHで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
マジック
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では)