Esiste un modo automatico per eseguire il piping della shell in Ruby? Sto cercando di convertire il seguente codice shell a Ruby:Tubi color rubino: come legare insieme l'output di due sottoprocessi?
a | b | c... > ...
ma l'unica soluzione che ho trovato finora è quello di fare la gestione del buffer me (semplificato, non testato, spero che ottiene il mio senso di diametro):
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...
Immagino che quello che sto cercando sia un modo per dire a popen di usare uno stream esistente, invece di crearne uno nuovo? O in alternativa, un IO # unisce il metodo per connettere l'output di a per l'input di b? Il mio attuale approccio diventa piuttosto poco pratico quando il numero di filtri aumenta.
Sono a conoscenza di Kernel#system('a | b')
ovviamente, ma ho bisogno di mescolare i filtri Ruby con i filtri di programma esterni in modo generico.
C'è una soluzione con il comando spawn in ruby. È necessario aprire più pipe e quindi utilizzare le opzioni di spawn per reindirizzare Stdin e Stdout dei processi figli. Puoi trovare un esempio più dettagliato nella mia risposta qui: http://stackoverflow.com/questions/11898528/marshal-ruby-pipes-sending-serialized-object-to-child-processes/13258047#13258047 –
Le condotte di Open3 sembrano belle ideale https://ruby-doc.org/stdlib-2.4.1/libdoc/open3/rdoc/Open3.html#method-c-pipeline_rw – kch