rehashについて

とあるサイトを見ていたら、rehashというコマンドが使われていて、何なのか知らなかったので調べてみた。

rehash ハッシュテーブルを再構築する。cshtcsh の内部コマンド

UNIXの部屋 コマンド検索:rehash (*BSD/Linux)

なんで、今までお世話にならなかったのだろうと考えたら、メインで使っているシェルがbashだからだと納得した。

cshで実際にやってみた

さて、せっかく知ったので、いくつか試してみた。

シェルの変更とPATH確認

まずは、シェルをcshに変更して、PATHの確認

$ csh
$ env | grep PATH
PATH=/usr/local/ruby/1.8.7/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/ユーザ名/bin

PATHに/home/ユーザ名/binが含まれていたので、そこで試してみる事にする。

~/binの作成

~/bin が無かったので、作成

$ cd ~/
$ mkdir bin
スクリプトの作成の実行権限の付与

実行すると文字列が出力されるスクリプトを作成

$ vim bin/test1
#!/bin/sh
echo "hello"

実行権限の付与

$ chmod 755 bin/test1
絶対パスを指定して実行

絶対パスを指定して実行するとハッシュテーブルを使わないらしいので、まずは、スクリプトの動作確認をかねて動かしてみる

$ ~/bin/test1
hello

実行された

rehashする前と後の実行結果
$ test1
test1: コマンドが見つかりません.
$ rehash
$ test1
hello

ハッシュテーブルを更新しないと実行できない事が確認できた。

名前を変えてみると
$ mv bin/test1 bin/test2
$ test1
test1: コマンドが見つかりません.
$ test2
test2: コマンドが見つかりません.
$ ~/bin/test2
hello
$ rehash
$ test1
test1: コマンドが見つかりません.
$ test2
hello

rehashが必要ですね。

bashでやってみた

bashだとハッシュテーブルは使わずに、毎回PATHを見に行くとの事なので、そっちもやってみた。

bashに変更
$ bash
実行してみる
$ test2
hello
名前を変更して実行してみる
$ mv bin/test2 bin/test3
$ test2
-bash: /home/hirai/bin/test2: そのようなファイルやディレクトリはありません
$ test3
hello