UNIX/Linuxの部屋 コマンド:hash bash のハッシュテーブル管理用コマンド。bash の内部コマンド。


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド hash bash のハッシュテーブル管理用コマンド。bash の内部コマンド。

bash においてコマンドを実行して、PATH からコマンドを見つけた場合、bash は内部のハッシュテーブルにコマンドのフルパスを登録し、次回以降はそのハッシュテーブルを活用する。

ハッシュテーブルは以下のように確認することができる。
$ ls
(略)
$ ls
(略)
$ date
(略)
$ hash
hits command
2 /bin/ls
1 /bin/date
hits は実行回数だが、特に意味はない。

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

つまり、新しいパッケージをインストールし、これまで存在しなかった 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 を参照。


頑張って書いたおすすめコンテンツ!