Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > open3ライブラリ > Open3モジュール > popen3

module function Open3.#popen3

popen3(*cmd) -> [IO, IO, IO][permalink][rdoc]
popen3(*cmd) {|stdin, stdout, stderr| ... } -> ()

外部プログラム cmd を実行し、そのプロセスの標準入力、 標準出力、標準エラー出力に接続されたパイプを 3 要素の配列で返します。 cmd は組み込み関数 Kernel.#exec と同じ規則で解釈されます。

stdin, stdout, stderr = *Open3.popen3("/usr/bin/nroff -man")
[PARAM] cmd:
実行するコマンドを指定します。
[RETURN]
ブロックを指定した場合はブロックの最後に評価された値を返します。 ブロックを指定しなかった場合は標準入力、標準出力、標準エラー を返します。

ブロックを指定するとパイプの配列を引数にブロックを実行し、最後にパイプ を close します。この場合はブロックの最後の式の結果を返します。

require 'open3'

Open3.popen3("read stdin; echo stdout; echo stderr >&2") {|stdin, stdout, stderr|
  stdin.puts "stdin"
  stdin.close     # または close_write
  p stdout.read
  p stderr.read
}
#=> "stdout\n"
    "stderr\n"

stdin への入力が終わったらできる限り早く close か close_write で閉じるべきです。

[UNIX系OS固有の注意] Open3 で作成した子プロセスは wait(2) しなくてもゾンビになりません。

コマンドは実際には孫プロセスとして動作するため、組み込み変数 $? でコマンドの終了ステータスを得ることはできません。