2012-01-04 15 views
6

Desidero essere in grado di trasmettere l'output di un processo figlio in RubyUscita flusso del processo figlio in Ruby

ad es.

p `ping google.com` 

Voglio vedere immediatamente le risposte ping; Non voglio aspettare il completamento del processo.

+2

Perché il downvote? Questa sembra una domanda valida e puntuale. – coreyward

risposta

5

Si dovrebbe usare IO#popen:

IO.popen("ping -c 3 google.com") do |data| 
    while line = data.gets 
    puts line 
    end 
end 
9

si possono fare le seguenti invece di utilizzare backticks:

IO.popen('ping google.com') do |io| 
    io.each { |s| print s } 
end 

Cheers!

+1

Beh, Dylan Markow mi ha picchiato a pugni apparentemente, ma lascerò questo solo per mostrare il metodo alternativo di iterare sui risultati (usando 'each' contro' while'). – coreyward

+2

Non dimenticare 'popen3' se vuoi catturare' STDERR'. – tadman

+0

thnx @tadman per aver menzionato popen3! – Zippie

3

Se vuoi catturare sia il stdout e stderr è possibile utilizzare popen2e:

require 'open3' 

Open3.popen2e('do something') do |_stdin, stdout_err, _wait_thr| 
    stdout_err.each { |line| puts line } 
end 
Problemi correlati