UNIX/Linuxの部屋 hashコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド hash bash のハッシュテーブル管理用コマンド。bash の内部コマンド。 このエントリーをはてなブックマークに追加

最終更新


hash コマンドは、UNIX/Linux のシェルである bash において、ハッシュテーブルに登録されたパスを表示したり管理するためのコマンドである。hash コマンドは bash の内部コマンドである。



hash コマンドの基本的な使い方
bash のプロンプトからコマンドを入力し、bash が PATH からコマンドを見つけた場合、bash は内部のハッシュテーブルにコマンドのフルパスを登録し、次回以降はそのハッシュ情報を活用する。

bash 内部のハッシュテーブルは以下のように確認することができる。下記例では ls コマンドと date コマンドがハッシュテーブルに登録されていることがわかる。
$ ls
(略)
$ ls
(略)
$ date
(略)
$ hash
hits command
2 /bin/ls
1 /bin/date
hits は実行回数だが単なる参考情報であり、挙動としては特に意味はない。

注意点は、「実行することができた」コマンドのフルパスがハッシュテーブルに登録されていくことである。逆に言うと、存在せず "Command not found" となったコマンドの情報がハッシュテーブルに蓄積されることはない。

つまり、新しいパッケージをインストールし、これまで存在しなかった hogehoge というコマンドが /usr/bin/ に増えた場合、bash に特に指示をしなくても問題なく見つけることができる。一方で csh や tcsh のハッシュテーブルは、PATH の全ディレクトリの下にあるコマンドを覚えておくという方式なので、新コマンドが増えたら rehash コマンドを実行しないといけない。

よって、bash のハッシュテーブルでハマるのは、下記のように、実行ファイルを削除したが、同名の実行ファイルが別ディレクトリにも存在するときであろう (つまり、結構レアケースである)。
$ ls /bin/foo /usr/bin/foo
/bin/foo
/usr/bin/foo
→ /bin/foo と /usr/bin/foo が存在する
$ echo $PATH
/bin:/usr/bin/foo
→ PATH は /bin の方が先
$ foo
→ /bin/foo がハッシュテーブルに登録された
$ rm /bin/foo
→ /bin/foo を削除した (/usr/bin/foo はそのまま)
$ foo
bash: /bin/foo: No such file or directory
→ /usr/bin/foo は存在するのに、/bin/foo がないと言われてしまう

bash でハッシュテーブルを個別に削除
bash でハッシュテーブルを個別に削除するには、hash -d を実行すればよい。
$ hash
hits command
2 /bin/ls
1 /bin/date
$ hash -d ls
→ ls のハッシュを削除
$ hash
hits command
1 /bin/date
→ ls に関する情報が消えた

bash でハッシュテーブルを全クリア
bash でハッシュテーブル全体をクリアするには hash -r を実行すればよい。
$ hash -r
$ hash
hash: hash table empty
→ 空になった

sh の場合
sh には上記のようなハッシュテーブルは存在しない。

csh・tcsh の場合
csh・tcsh におけるハッシュテーブルは、bash とは微妙に異なる。詳細は rehash を参照。