2012-04-19 23 views
38

¿Hay alguna manera de ejecutar un comando (de shell) desde la visualización de Ruby pero también capturando la salida? Tal vez con la ayuda de alguna gema?Ejecutando un comando desde Ruby mostrando y capturando la salida

Lo que quiero decir con la visualización no es imprimirlo al final, sino tal como aparece, para que el usuario reciba la retroalimentación de lo que sucede cuando se ejecutan comandos lentos.

Respuesta

68

Puede ejecutar la llamada al sistema como éste:

`sleep --help` 

O como este caso

system "sleep --help" 

O

%x{ sleep --help } 

En de system se imprimirá de salida y retorno true o nil , otros dos métodos devolverán la salida

PS Oh. Se trata de mostrar en tiempo real.

So. Usted podría utilizar algo como esto:

system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out) 

Para imprimir los datos en tiempo real y lo almacena en la variable:

output = [] 
r, io = IO.pipe 
fork do 
    system("ruby", "-e 3.times{|i| p i; sleep 1}", out: io, err: :out) 
end 
io.close 
r.each_line{|l| puts l; output << l.chomp} 
#=> 0 
#=> 1 
#=> 2 
p output 
#=> ['0', '1', '2'] 

o uso popen

output = [] 
IO.popen("ruby -e '3.times{|i| p i; sleep 1}'").each do |line| 
    p line.chomp 
    output << line.chomp 
end 
#=> '0' 
#=> '1' 
#=> '2' 
p output 
#=> ['0', '1', '2'] 
+1

Conozco esas formas de ejecutar un comando, ninguna captura la salida en una cadena y la genera al mismo tiempo. – Pablo

+0

Lo entiendo ahora mismo :) va a actualizar una respuesta) – fl00r

+0

@ J.PabloFernández, actualización de compra – fl00r

12

Puede redirigir la salida

system 'uptime > results.log' 

o guarde los resultados.

result = `uptime` 
result = %x[uptime] 

ver here. Obtener información de progreso o output in realtime es más complicado, dudo que haya una solución simple. Tal vez es posible con process management functions avanzado como Open3.popen3. También puede intentar usar un pseudo terminal with pty y grap the output there.

+0

qué idea. gracias ... – KULKING

+0

Gracias.Me ayudó. Simplemente agregue la siguiente línea, 'puts result'. Esto mostrará el resultado en la consola. –

7

Utilicé open3 para capturar la salida del comando de shell ejecutado desde el código de ruby.

require 'open3' 

stdout, stdeerr, status = Open3.capture3("ls") 

puts stdout 
Cuestiones relacionadas