RubyでOpen3を使って外部のプログラムを実行する

目次

RubyでOpen3モジュールを使って外部コマンドやプログラムを実行する方法についてまとめました。

Open3の概要

Open3はRubyに標準でインストールされているモジュールです。

これは、外部のコマンドやプログラムを実行して、その標準入力・標準出力・ 標準エラーにパイプをつなぎます。

なので、そのコマンドやプログラムに入力を与えたり、そのの結果を取得できます。

使い方

Linuxで日付を取得するdateコマンドを実行してみます。

require 'open3'
o, e, s = Open3.capture3("date")
p o #=> "Sat Jan  16 20:20:22 JST 2016"
p e #=> ""
p s #=>#<Process::Status: pid 32682 exit 0>

最初にopen3をrequireする必要があります。

実際にコマンドを実行するのは、Open3.capture3メソッドです。このメソッドの引数に実行したいコマンドを文字列として渡します。

このメソッドは戻り値として、標準出力、標準エラーとプロセスの終了ステータスを表す配列のオブジェクトを返すので、3つの変数(o, e, s)を用意して代入しています。

oは標準出力、eは標準エラー、sはプロセスの終了ステータスです。

このプログラムでは、標準入力を渡してはいませんが次のプログラムのようにして渡す事ができます。

require 'open3'
o, e, s = Open3.capture3("sort", stdin_data: "foobarhogen")
p o #=> "barnfoonhogen"
p e #=> ""
p s #=>#<Process::Status: pid 33002 exit 0>

このプログラムは、sortコマンドを使って入力として与えられた「foo」「bar」「hoge」をソートしするプログラムです。

このように、標準出力はstdin_dataというキーワード引数として渡します。

さいごに

他にも外部のコマンドやプログラムを実行するものはあるのですが、標準入力を渡すのであればこれが一番便利だと思っています。