LoginSignup
4
0

More than 3 years have passed since last update.

irbで日本語が打てない→readline入れてruby再インストール→pryで謎のエラー

Last updated at Posted at 2019-09-22

どうも。エンジニア経験が(全く)ないruby新生児です。
初めてしっかり言語学習に時間をかけて寝返りが打てる程度にはなろうと思い、業務的にも身近なrubyの勉強を始めようとしたら、のっけからつまずいてしまいました…orz
ruby(rails)の環境設定を進めて行く上で解決に時間かかった(ググってもいまいち出てこなかった)エラーについて残そうと思います。

起こったこと

  1. こちらの記事rbenv-communal-gems とか pry 入れておくと良いよ!と書かれていたので入れてみた
    (各々の役割については割愛)

  2. irb(or pry)起動 → 日本語文字が入力できない!?

  3. readlineをインストール

  4. ruby再インストール

  5. pryを起動したら以下の謎エラーが発生↓

mkdir: /usr/local/bin/../version_cache: Permission denied
/usr/local/bin/rbenv-communal-gem-home: line 21: /usr/local/bin/../version_cache/2.5.6: No such file or directory

※ エラーは表示されるもののpry自体は問題なく動いた(それが更にすっっっごくモヤッと)
※ 再インストール前まではこんなエラー表示されていなかった

原因

不明。探ろうとしてすごく時間を取られた…orz
上に記載したエラー内容を見ると、読んで字の如く言われてることは以下の2点

  • お前にmkdirする権限はない
  • /usr/local/bin/rbenv-communal-gem-home21行目に書かれてるディレクトリは存在しない

とりあえずここを解決しよう。

解決まで

エラーの原因を探る


#!/usr/bin/env bash
# 
# Summary: Show the communal gem home if communal gems are enabled
#
# Usage: rbenv communal-gem-home [<version>]

# Provide rbenv completions
if [ "$1" = "--complete" ]; then
  exec rbenv-versions --bare
fi

rbenv_version="${1:-$(rbenv-version-name)}"
if [ -L "$RBENV_ROOT/versions/$rbenv_version/lib/ruby/gems" ]; then
  cachedir="${BASH_SOURCE%/*}/../version_cache"
  cachefile="$cachedir/$rbenv_version"
  if [ -f "$cachefile" ]; then
    communal_version="$(cat $cachefile)"
  else
    mkdir -p "$cachedir"
    communal_version="$("$RBENV_ROOT/versions/$rbenv_version/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["ruby_version"]')"
    echo "$communal_version" > "$cachefile"
  fi

  echo "$RBENV_ROOT/gems/$communal_version"
else
  exit 1
fi

とってもシンプルなif文のみで書かれたbashスクリプトさん(瀕死)。
とりあえず21行目を見てみると echo "$communal_version" > "$cachefile" ってある。
この2つの変数の内、$cachefile が19行目の mkdir -p とも絡んでるし怪しい。-pのオプションが分からずをググったら エラーを表示せず記述したディレクトリが存在しなければ作成する ものらしい(参照)。
つまり発生していたエラーは

  • makdir -p "$cachefile" → ディレクトリあるかな?ない、つくろう! → 権限なかった。作れんわ → エラー
  • $communal_version$cachefile にリダイレクトだ! →  $cachefileなんてディレクトリねぇよ、権限もねぇし作れんよ

と言われていたんですね。
つまり諸悪の根源は14行目のこいつ

cachedir="${BASH_SOURCE%/*}/../version_cache"

ここのパスを変更すれば良い。
・・・
・・・・・・・
・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
どこのパスに向ければいいの??(←これ一番困った)

対応する

いろいろ捏ね繰り回して考えて巡り巡って出した答えとしては、

 * version_cacheがあるパスが分かればいい
 * もしなけりゃ適当に作っちゃおう(その為のmakdir -p(pオプション)なんだし)
 (この辺り本職のエンジニアさんたちならどう判断するんだろう…)

問題となっているのはgemでinstallしたrbenv-communal-gems なわけだから、この周辺のディレクトリを漁りましょう。
エラー吐いてたのは/usr/local/bin/rbenv-communal-gem-homeなので、この辺に該当ディレクトリがないかな??と思いbinを覗いたら全てシンボリックリンクであることがわかった

略)
lrwxr-xr-x   1 username  admin   31  9 19 16:52 rbenv -> ../Cellar/rbenv/1.1.2/bin/rbenv
lrwxr-xr-x   1 username  admin   65  9 21 23:19 rbenv-communal-gem-home -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-communal-gem-home
lrwxr-xr-x   1 username  admin   57  9 21 23:19 rbenv-communize -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-communize
lrwxr-xr-x   1 username  admin   47  9 19 16:52 rbenv-install -> ../Cellar/ruby-build/20190828/bin/rbenv-install
lrwxr-xr-x   1 username  admin   57  9 21 23:19 rbenv-sequester -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-sequester
lrwxr-xr-x   1 username  admin   49  9 19 16:52 rbenv-uninstall -> ../Cellar/ruby-build/20190828/bin/rbenv-uninstall
lrwxr-xr-x   1 username  admin   44  9 19 16:52 ruby-build -> ../Cellar/ruby-build/20190828/bin/ruby-build

(余談だけどこのシンボリックリンクの群れを見て[パスを通すってこういうことか!!]となんとなく思ったり.)

rbenv-communal-gemsの実体は ../Cellar/rbenv-communal-gems配下にあると。
んだばそこ覗いたらすぐ見つかった version_cache.
../Cellar/rbenv-communal-gems/1.0.1_1/version_cacheにあった。

これで勝てる...!!

問題だった cachedirを以下のように書き換えました。


cachedir="${BASH_SOURCE%/*}/../Cellar/rbenv-communal-gems/1.0.1_1/version_cache"
#cachedir="${BASH_SOURCE%/*}/../version_cache"

これで再度pryを打ってみたところ、エラー発生しなくなりました(めでたしめでたし

あとがき

前に環境構築したときは問題なく行ったので今回のように出鼻からくじかれるとは思いもしませんでした。
どの過程が原因で起きたエラーかも分からなかったので手順やらHomebrew,rbenv,gem,環境変数やらshell(bash)などなど,いろんなのを調べまくりました。エラー1個で大騒ぎはしたものの色々と知識を得られたので良しとします。
ruby新生児のアマグラマーがプログラマーに至るまで大いに努力したいと思います。

余談)多分version_cacheディレクトリが見つからなかったら適当なディレクトリを cachedirにあてがってしまってよかったんだろうなと終わってから思いました。

4
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0