windowsのirb上でriを使う。

昨日の方法は、One-Click rubyで構築したwindosの環境では動きませんでした。``*1で呼ばれる「exec」がうまく動いてくれないみたいです。
以下のエラーが出力されてしまいます。

Errno::ENOEXEC: Exec format error - ri
        from (irb):1in ``'
        from (irb):1

出力されたエラーを元に探してみたところ、windowsでは「hoge.rb」を呼びたい場合には、
「exec "hoge.rb"」ではなく、「exec "ruby hoge.rb"」としなければならないことがわかりました。どうやら呼びたいものを直接指定しなければならないようです。でも、変です。コマンドプロンプトでは「refe」だけで呼ぶことができるんです。何か仕掛けがあるに違いありません。
 あれこれ探してみると、「ri.bat」というファイルがありました。もしかしたら、これがコマンドプロンプトとriをつなげてくれているのかもしれません。
 refe.batを探してみます。 − 「refe.bat」はありませんでしたが「refe.cmd」というファイルを発見しました。おそらく、コマンドプロンプト上で「refe」と入力したとき、このファイルが呼ばれているのだと思います。実験してみます。

`ri.bat `   #irb上で入力
  #=>適切な処理が帰ってくる
puts `refe.cmd IO.to_i`
  #=>適切な処理が帰ってくる。

おおー動きました。(・▽・)!

というわけで、windows

module Kernel
  def f(name, arg)
    puts `#{name} #{arg}`
  end
  def r(arg); f("refe.cmd", arg); end
  def ri(arg); f("ri.bat", arg); end
  private :r, :ri, :f
end

class Module
  def f(name, meth)
    if meth
      if instance_methods(false).include? meth.to_s
        puts `#{name} #{self}##{meth}`
      else
        super
      end
    else
      puts `#{name} #{self}`
    end
  end
  def r(arg=nil); f("refe.cmd", arg); end
  def ri(arg=nil); f("ri.bat", arg); end
end

まとめ

コマンドプロンプトで「*」と入力した場合

  • 「*.cmd」か「*.bat」が呼ばれている。*2

irbで「`*`」と入力した場合

  • 呼ばれるのは「*」

なので、

  • refe -> refe.cmd
  • ri -> ri.bat

windowsであまりプログラミングしないので、知りませんでした。><

*1:ruby上でコマンドを実行するときに使う

*2:refe なら refe.bat もしくは refe.cmd