パイプの使い方

IO.popen

ブロックなし

IO オブジェクトを返す

popen(env = {}, command, mode = "r", opt={})
popen([env = {}, cmdname, *args, execopt={}], mode = "r", opt={})
popen([env = {}, [cmdname, arg0], *args, execopt={}], mode = "r", opt={})
popen(env = {}, [cmdname, *args, execopt={}], mode = "r", opt={})
popen(env = {}, [[cmdname, arg0], *args, execopt={}], mode = "r", opt={})

ブロックあり

IO オブジェクトを引数にブロックを実行し、ブロックの実行結果を返す

popen(env = {}, command, mode = "r", opt={}) {|f| ... }
popen([env = {}, cmdname, *args, execopt={}], mode = "r", opt={}) {|f| ... }
popen([env = {}, [cmdname, arg0], *args, execopt={}], mode = "r", opt={}) {|f| ... }
popen(env = {}, [cmdname, *args, execopt={}], mode = "r", opt={}) {|f| ... }
popen(env = {}, [[cmdname, arg0], *args, execopt={}], mode = "r", opt={}) {|f| ... }

サブプロセスを実行し、そのプロセスの標準入出力との間にパイプラインを確立する。生成したパイプを IO オブジェクトとして返す。

サブプロセスを指定する方法は2通りある。文字列を指定する場合と配列を指定する場合です。 文字列の場合は、シェルを経由して子プロセスを実行し、 配列の場合は、シェルを経由せずに子プロセスを実行する。

シェルを経由しない場合 (cmdname を含む場合)には *args がサブプロセスの引数として使われる。この場合には *args はシェルでの ワイルドカード展開などはなされない。

配列内に配列を指定することで、arg0(みせかけのプログラム名)を指定することができる。

ブロックが与えられた場合は生成した IO オブジェクトを引数にブロックを実行し、ブロックの実行結果を返す。ブロックの実行後、生成したパイプは自動的にクローズする。

オプションの詳細は Kernel.#spawn や IO.new を参照のこと。

# 外部文字コードに EUC-JP を指定
IO.popen("nkf -e filename", external_encoding: "EUC-JP") do |io|
  io.read
end

ls / 2>&1 に相当

# 標準エラー出力を子プロセス側で標準出力にリダイレクトする
# 標準エラー出力と標準出力が合流される
IO.popen(["ls", "/"], :err=>[:child, :out]) do |io|
  io.read
end

参考:

singleton method IO.popen (Ruby 2.5.0)

module function Kernel.#spawn (Ruby 2.5.0)

singleton method IO.for_fd (Ruby 2.5.0)

Tagged:

コメントを残す

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