rbenv rehashは何をやっているのか?
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" "$@"
カテゴリ:
Ruby