有没有一种自动化的方式在Ruby中进行shell管道操作?我正在尝试将以下shell代码转换为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使用现有流而不是创建新流的方法?或者,一个IO#merge方法来将a的输出连接到b的输入?当过滤器数量增加时,我的当前方法变得相当笨重。
我知道显然有Kernel#system('a | b')
,但我需要以通用的方式混合Ruby过滤器和外部程序过滤器。