長いPATHが設定されている可能性が高く、実行可能ファイルを見つけるには、シェルがパスを検索する必要があります。プログラムを実行するたびにその時間のかかるプロセスを回避するために、シェルは既に見つかったプログラムのリストを保持する場合があります。そのリストは「ハッシュ」と呼ばれます。シェルwhichがハッシュされていると言うとき、それはすでにPATH検索を実行whichし、ハッシュ内でその場所を見つけて保存したことを意味します。
man bash 次のように説明します。
Bashはハッシュテーブルを使用して、実行可能ファイルのフルパス名を記憶します(以下のSHELL BUILTINコマンドのハッシュを参照)。PATH内のディレクトリの完全検索は、コマンドがハッシュテーブルで見つからない場合にのみ実行されます。
ハッシュは通常、シェル操作を高速化しますが、問題を引き起こすケースが1つあります。システムを更新し、その結果、一部の実行可能ファイルが新しい場所に移動すると、シェルが混乱する可能性があります。解決策はhash -r、シェルがすべてのハッシュされた場所を忘れ、PATHを最初から検索するように実行することです。
一部の実行可能ファイルがハッシュから欠落しているのはなぜですか?
少なくとも1回実行するまで、実行可能ファイルはハッシュに配置されません。観察する:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python 実行された後にのみハッシュされます。
bashのハッシュの内容を調べる方法
ハッシュの内容はbash配列で利用可能ですBASH_CMDS。コマンドでその中身を確認できますdeclare -p BASH_CMDS。新しいシェルまたはサブシェルが開かれると、ハッシュは空になります。コマンドは使用されるたびに1つずつ追加されます。新しく開いたシェルから、次を観察します。
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which、ではないのpythonですか?