rbenv rehashは何をやっているのか?

ruby初心者ですが調べてみました。 (何か間違っていたら教えてください>< )

rbenv rehashは何をやっているのか?

端的にいうと、
「~/.rbenv/versions/2.x.y/bin/ 以下に置いてあるコマンド群を ~/.rbenv/shims/以下に置いて使えるようにする」
ことです。

例えば、rbenvとRubyBuildでruby2.1.0をインストールした直後だと、~/.rbenv/shimsは下記のような状態です。
$ ls ~/.rbenv/shims
erb*  gem*  irb*  rake*  rdoc*  ri*  ruby*  testrb*
この状態で "gem install chef", "gem install berkshelf"などとすると、~/.rbenv/versions/2.1.0/bin/ の方にコマンドが入ります。
$ ls ~/.rbenv/versions/2.1.0/bin
berks*        chef-service-manager*  chef-zero*  erubis*    httpclient*  ldiff*     ohai*  pumactl*  rdoc*        ruby*    thor*
chef-apply*   chef-shell*            coderay*    gem*       irb*         minitar*   pry*   rackup*   restclient*  shef*
chef-client*  chef-solo*             erb*        htmldiff*  knife*       nokogiri*  puma*  rake*     ri*          testrb*
ところが、~/.rbenv/shims/の方には変化がありません。 この状態ではchef-soloコマンドやknifeコマンドを使うことはできません。
$ which knife
knife not found
$ ls ~/.rbenv/shims
erb*  gem*  irb*  rake*  rdoc*  ri*  ruby*  testrb*
ここで、rbenv rehashを実行すると、~/.rbenv/versions/2.1.0/bin/下のコマンドが ~/.rbenv/shims/ にコピーされます。(厳密にはコピーではないけど)
$ rbenv rehash
$ ls ~/.rbenv/shims
berks*        chef-service-manager*  chef-zero*  erubis*    httpclient*  ldiff*     ohai*  pumactl*  rdoc*        ruby*    thor*
chef-apply*   chef-shell*            coderay*    gem*       irb*         minitar*   pry*   rackup*   restclient*  shef*
chef-client*  chef-solo*             erb*        htmldiff*  knife*       nokogiri*  puma*  rake*     ri*          testrb*
これで、晴れてknifeコマンドが使えるようになります。
$ which knife
/home/dqneo/.rbenv/shims/knife

おまけ:~/.rbenv/shims/* の中身

実は全部同じファイルです。
diff ~/.rbenv/shims/rake ~/.rbenv/shims/ruby
(差分なし)
~/.rbenv/shims/rakeも ~/.rbenv/shims/rubyも中身は同じで、下記のようなラッパーシェルスクリプトになっています。
% cat ruby
#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export RBENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export RBENV_ROOT="/home/dqneo/.rbenv"
exec "/home/dqneo/.rbenv/libexec/rbenv" exec "$program" "$@"
カテゴリ: