パス内の実行可能ファイルのbashのキャッシュを無効にする


12

これは重複していないことに注意してください。キャッシュをクリアするのではなく、キャッシュを無効にすることを求めています。クリアするキャッシュがある場合、それは明らかに無効ではありません。

まれに、bashがパスで見つけたもののキャッシュに気づく場合があります。それは、それが役に立ったからではなく、流血の迷惑なためです。例:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

別のシェルで...

~ dc$ which which
/usr/bin/which

このキャッシングは、ディスクが遅く、メモリが高価で制限されていたため、あまりキャッシュできなかった古き良き時代には理にかなっていると思います-パスをキャッシュすることは、コマンドを見つけるために必要なすべてのディスクブロックをキャッシュするよりも安価です。 。しかし、最近では目立った利点はなく、解決する以上の問題を引き起こしています。バグであることをあきらめて、それは間違った機能です。

そして、それを無効にする方法すら見つけられません。ポインタはありますか?


1
/usr/bin完全にキャッシュに残っているRAMがそれほど多くない場合、デスクトップマシンの一般的なケースであっても、その利点は顕著です。
Gilles「SO-悪をやめる」14

1
@drhyde、ごめんなさい。この質問を重複としてマークしました。set +hハッシュを無効にするために使用します。
Evgeny Vereshchagin 2015

Nixosでは、bashでハッシュを無効にしました。ニクソスの働き方のおかげで、それはもっともな理由だと思います。ただし、これがNixosにとって本当に必須かどうかはわかりません。私が言っているのは、bashのハッシュは特定の状況で問題を引き起こす可能性があるということです。
typelogic

回答:


12

プロンプトが表示される前に、ハッシュされた実行可能ファイルをクリアできます。

PROMPT_COMMAND='hash -r'

からhelp hash

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.

1
参照私の答えについてset +h
エフゲニーVereshchagin

1
@EvgenyVereshchagin set +hは理想的ではありません。多くのユーティリティ(たとえば、ruby gemのインストール)がを呼び出しhash-bash: hash: hashing disabled警告のストリームを生成するためです。
デビッドモレス

Python virtualenvアクティベーションでも同じ警告メッセージが表示されます。でも無害だと思います。
typelogic

8

ハッシュテーブル内のコマンドが存在しない場合に備えて、bashに新しいパスルックアップを強制することができます。

shopt -s checkhash

bashのマンページから:

チェックハッシュ

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

例:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.