2010-11-29 20 views
9

Similar a Getting output of system() calls in Ruby, estoy ejecutando un comando del sistema, pero en este caso necesito enviar el STDOUT desde el comando mientras se ejecuta.¿Cómo obtengo el STDOUT de una llamada al sistema ruby ​​() mientras se está ejecutando?

+0

Es curioso que lo que tenga que hacer nada especial. En mi experiencia, cuando ejecuto un programa que usa 'system', el stdout del programa secundario va al stdout del programa principal, que parece ser lo que quiere. –

+0

Esto también puede funcionar: http://stackoverflow.com/questions/2215455/printing-to-screen-in-a-rake-task/2215986#2215986 –

Respuesta

13

Al igual que en la pregunta vinculada, la respuesta es nuevamente no usar system, ya que system no es compatible con esto.

Sin embargo, esta vez la solución no es usar backticks, sino IO.popen, que devuelve un objeto IO que puede usar para leer la entrada mientras se está generando.

+7

Gracias, Terminé usando 'IO.popen ('command_to_run ') {| io | while (line = io.gets) do pone line end} ' –

0

aquí es mi solución

def io2stream(shell, &block) 
    Open3.popen3(shell) do |_, stdout, stderr| 
    while line = stdout.gets 
     block.call(line) 
    end 

    while line = stderr.gets 
     block.call(line) 
    end 
    end 
end 

io2stream("ls -la", &lambda { |str| puts str }) 
Cuestiones relacionadas