【.irbrcとは】Rails console 及び irb でexitすると謎のエラーが出た時の解決法

irbrcとは

Railsで開発中、Rails consoleにて謎のエラーが出力されたので、同様の現象にぶつかった人の為に対策を書き留めておこうと思います。

スポンサードリンク

.irbrc_history(Errno::EACCES)

rails conosoleからexitした際に、次のようなエラーが出力されました。

>> exit
   (0.1ms)  rollback transaction
/usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:98:in `initialize': Permission denied @ rb_sysopen - /usr/local/rvm/rubies/ruby-2.4.1/.irbrc_history (Errno::EACCES)
        from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:98:in `open'
        from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:98:in `save_history'
        from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:64:in `block in extended'
        from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb.rb:433:in `block in run'
        from /usr/local/rvm/rubies/ruby-
--省略--

基本エラーは上のものだけ見れば良いのでこの部分に注目しましょう。

>> exit
   (0.1ms)  rollback transaction
/usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/irb/ext/save-history.rb:98:in `initialize': Permission denied @ rb_sysopen - /usr/local/rvm/rubies/ruby-2.4.1/.irbrc_history (Errno::EACCES)

save-histrory.rbの98行目で何やら謎のPermission deniedが起きている様です。「.irbrc_history」という謎のファイルにも関連しており、結果的にErrno::EACCESが出力されています。

Errno::EACCESについて

Errno::EACCESはRubyの組み込みライブラリで、システムコールのエラーコードを表す例外クラスです。

Rubyのリファレンスマニュアルには次のように書かれています。

システム依存のエラーコードのそれぞれに対応する一連の例外クラスです。 Rubyのライブラリ内部でシステムコールや一部のC言語関数が失敗したときに発生します。

実際には「EXXX」というクラスが定義されているわけではありません。「XXX」の部分は下記に列挙したような各種のエラー名が入ります。 例えば、File.open の内部でシステムコール open(2) がエラーコード ENOENT を返すと、Rubyは例外 Errno::ENOENT を発生させます。

Ruby は処理系がコンパイルされるときに、デフォルトで下記リストのような Errno::EXXX クラスを定義しようとします。 動作環境に EXXX というエラーコードが存在しない場合、Rubyはその Errno::EXXX を Errno::NOERROR の別名として定義します。
Rubyリファレンスマニュアルより引用

ライブラリ内部によるシステム依存のエラーっぽいです。良く分かりませんが「.irbrc_history」に関連があるのは間違いなさそうです…。

同様の事例が無いか検索してみる

自分の知識では解決できなさそうなので同様の事例が無いか検索してみたところ、stack overflowで同様の事例が1件見つかりました!

解決法には以下の様に記述されています。

Create, or edit your ~/.irbrc file to include:

require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 200
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-history"

ルート配下に「.irbrc」ファイルを作成し、上の記述を追記した後保存したら、エラーが出なくなりました。一件落着。

エラーの原因は何だったのか

解決したのは良いものの、エラーの原因を知らなければまた類似のエラーにぶつかった時に解決することが出来ません。というわけでもう少しstack overflowを見ていくと

rvm 1.29.3 (current stable) has a bug where IRB history gets saved in the RUBY_HOME instead of HOME.
–stack overflowより引用–

これを訳すと、

「rvm 1.29.3(現在の安定版)は、IRBの履歴がHOMEの代わりにRUBY_HOMEに保存されるというバグがあります。」

となります。どうやらrvmのバージョンによって「.irbrc_history」が保存される場所が変わってくるようで、参照先にhistoryファイルが存在しないことから今回のエラーに繋がった様です。

.irbrcファイルはirbの設定を記述するファイルなので、今回作成した「.irbrc」ファイルに「.irbrc_history」のパスをホーム配下を参照するように変更した、という訳です。なるほど、理解しました。

まとめ

・今回のエラーはrvmによって引き起こされるエラー

・システム依存のエラーは原因が特定しにくいので、エラー部分の出力をよく読んで、同様の事例が無いか検索してみる

以上です。同様の現象に引っかかった人は試してみて下さい。

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です