小编Arn*_*rno的帖子

Ruby管道:如何将两个子进程的输出绑定在一起?

是否有自动方式在Ruby中进行shell管道?我正在尝试将以下shell代码转换为Ruby:

a | b | c... > ...
Run Code Online (Sandbox Code Playgroud)

但到目前为止我找到的唯一解决方案是自己做缓冲管理(简化,未经测试,希望它能得到我的意思):

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...
Run Code Online (Sandbox Code Playgroud)

我想我想要的是告诉popen使用现有流而不是创建新流的方法?或者,IO#merge方法将输出连接到b的输入?当滤波器数量增加时,我当前的方法变得相当笨拙.

我明白知道Kernel#system('a | b'),但我需要以通用的方式将Ruby过滤器与外部程序过滤器混合在一起.

ruby pipe popen

16
推荐指数
3
解决办法
1万
查看次数

标签 统计

pipe ×1

popen ×1

ruby ×1