¿Hay una manera automatizada de hacer tubería de concha en Ruby? Estoy tratando de convertir el siguiente código shell a Ruby:Tubos de rubí: ¿Cómo ato la salida de dos subprocesos?
a | b | c... > ...
pero la única solución que he encontrado hasta ahora es hacer la gestión de memoria intermedia a mí mismo (simplificado, no probada, la esperanza de que llegue mi sentido de diámetro):
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...
Supongo que lo que estoy buscando es una forma de decirle a popen que use una transmisión existente, en lugar de crear una nueva? ¿O, alternativamente, un método de fusión IO # para conectar la salida de a a la entrada de b? Mi enfoque actual se vuelve poco manejable cuando crece la cantidad de filtros.
Sé acerca de Kernel#system('a | b')
obviamente, pero necesito mezclar los filtros Ruby con los filtros de programas externos de una manera genérica.
Hay una solución con el comando spawn en ruby. Debería abrir varias tuberías y luego usar las opciones de generación para redirigir Stdin y Stdout de procesos secundarios. Se puede encontrar un ejemplo más detallado en mi respuesta aquí: http://stackoverflow.com/questions/11898528/marshal-ruby-pipes-sending-serialized-object-to-child-processes/13258047#13258047 –
tuberías de Open3 parecen bastante ideales https://ruby-doc.org/stdlib-2.4.1/libdoc/open3/rdoc/Open3.html#method-c-pipeline_rw – kch