Есть ли автоматизированный способ сделать конвейерную оболочку в 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 с фильтрами внешних программ в общий способ.