パイプの使い方
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)