有没有一种自动化的方式在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