Есть ли автоматизированный способ создания оболочки в 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#merge для подключения выхода a к входу b? Мой текущий подход становится довольно громоздким, когда количество фильтров растет.
Я, очевидно, знаю о Kernel#system('a | b')
, но мне нужно смешивать фильтры Ruby с внешними программными фильтрами общим способом.