Rubyでは、外部プログラムを実行するメソッドが用意されている。
例えば、lsコマンドを実行したかったら、
result = exec "ls"
もしくはバッククウォートを用いて
result = `ls`
と書く。すると、lsの実行結果の標準出力が、文字列となってresultに格納される。
ここで問題なのは、標準エラー出力をするような外部プログラムを実行した場合、その標準エラー出力の内容がこの方法では得られないという点。
そこで使うのは、添付ライブラリのopen3である。
- Rubyリファレンスマニュアル - open3
- http://www.ruby-lang.org/ja/man/?cmd=view;name=open3
Open3を用いることで、外部プログラムを実行しつつ、それに対応する標準入力、標準出力、標準エラー出力の3つ組を得ることができる。
WindowsでOpen3
しかし、このOpen3というライブラリはWindowsでは動作しないようだ。
マニュアルにもあるが、win32-open3というライブラリをgemで持ってくる必要がある。
- RubyForge Win32 Utils ファイルリスト
- http://rubyforge.org/frs/?group_id=85
ここで、これを執筆している2007/11/1当時では、
- win32-open3-0.2.5.gem
- win32-open3-0.2.5-mswin32.gem
がある。
ここでは、前者はうまくインストールできなかったので、後者をダウンロードする。
そしていつものように、
$ gem install win32-open3-0.2.5-mswin32.gem
とすればOpen3のインストールは完了。
win32-open3の基本的な使い方は以下の通り。
require 'win32/open3' # ハイフンではなくスラッシュなので注意 Open3.popen3("command") do |stdin, stdout, stderr| stdin.write("hoge") puts stdout.read puts stdout.read end