Ruby pipe: Как сделать Я связываю выходные данные двух подпроцессов вместе?

Есть ли автоматизированный способ сделать конвейерную оболочку в 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 использовать существующий поток вместо создания нового? Или, альтернативно, метод слияния IO # для подключения вывода a к вводу b? Мой текущий подход становится довольно громоздким, когда количество фильтров растет.

Я знаю о Kernel # system ('a | b') , очевидно, но мне нужно смешивать фильтры Ruby с фильтрами внешних программ в общий способ.

16
задан the Tin Man 27 November 2010 в 00:24
поделиться