Rubyでシェルパイピングを自動化する方法はありますか? Rubyパイプ:2つのサブプロセスの出力を結合するにはどうすればよいですか?
a | b | c... > ...
が、私がこれまでに発見した唯一の解決策は、バッファ管理を自分で行うことです(未テスト、簡略化され、それは全体の私の意味を取得します願っています):私は、Rubyに次のシェルコードを変換しようとしている
a = IO.popen('a')
b = IO.popen('b', 'w+')
Thread.new(a, b) { |in, out|
out.write(in.readpartial(4096)) until in.eof?
out.close_write
}
# deal with b.read...
私が探しているのは、新しいものを作成するのではなく、既存のストリームを使用するようにpopenに指示する方法でしょうか?あるいは、aの出力をbの入力に接続するIO#マージメソッド?私の現在のアプローチは、フィルタの数が増えたときにはかなり扱いにくくなります。
私は明らかに約Kernel#system('a | b')
を知っていますが、一般的な方法でRubyフィルタと外部プログラムフィルタを混在させる必要があります。
rubyにspawnコマンドを含む1つのソリューションがあります。いくつかのパイプを開き、子プロセスのStdinとStdoutをリダイレクトするためにspawnオプションを使用する必要があります。より詳細な例は私のここで私の答えで見つけることができます:http://stackoverflow.com/questions/11898528/marshal-ruby-pipes-sending-serialized-object-to-child-processes/13258047#13258047 –
Open3のパイプラインはかなり見えます理想的なhttps://ruby-doc.org/stdlib-2.4.1/libdoc/open3/rdoc/Open3.html#method-c-pipeline_rw – kch