有沒有一種自動化的方式在Ruby中執行shell管道?我想轉換下面的shell代碼到Ruby:Ruby管道:我如何將兩個子進程的輸出連接在一起?
a | b | c... > ...
但到目前爲止,我已經找到了唯一的解決辦法就是做緩衝管理自己(簡體,未經測試,希望它橫跨得到了我的意思):
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使用現有的流,而不是創建一個新的?或者,將#輸出連接到b的輸入的IO#合併方法?當過濾器數量增加時,我目前的方法變得相當不實。
我知道Kernel#system('a | b')
很明顯,但我需要以通用的方式將Ruby過濾器與外部程序過濾器混合使用。
在ruby中有一個使用spawn命令的解決方案。你應該打開幾個管道,然後使用產卵選項來重定向Stdin和Stdout子進程。你可以在我的答案中找到更詳細的示例:http://stackoverflow.com/questions/11898528/marshal-ruby-pipes-sending-serialized-object-to-child-processes/13258047#13258047 – 2012-11-07 19:48:50
Open3的管道看起來很漂亮理想的https://ruby-doc.org/stdlib-2.4.1/libdoc/open3/rdoc/Open3.html#method-c-pipeline_rw – kch 2017-05-31 05:33:08