2010-08-28 22 views
7

Tengo que ejecutar un comando de shell desde el script de Ruby, pero tengo que recuperar el resultado para poder usarlo en el script más adelante.Devuelve la salida del comando "sistema" en Ruby?

Aquí está mi código:

output = system "heroku create" # => true 

Pero el comando del sistema devuelve un valor lógico y no el de salida.

Dicho simplemente, el sistema "heroku create" tiene que salir a mi pantalla (lo que hace) pero también devuelve la salida para que pueda procesarlo.

+0

Ver http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – weakish

Respuesta

8

La biblioteca Open3 le da acceso total a las corrientes IO estándar (stdin, stdout y stderr). Es parte de Ruby, así que no hay necesidad de instalar una joya:

require 'open3' 

stdin, stdout, stderr = Open3.popen3("heroku create") 
puts stdout.read 
stdin.close; stdout.close; stderr.close 

o se puede utilizar la forma de bloque que cierra las corrientes implícitamente:

require 'open3' 

Open3.popen3("heroku create") do |stdin, stdout, stderr| 
    puts stdout.read 
end 

Véase el Open3 documentation para los detalles completos.

Editar: Se agregaron detalles adicionales de cierre de la secuencia. Gracias Christopher y Gregory.

+1

¿No es cierto? se supone que 'cerrar' estos? Estoy buscando documentación sobre esto, y ninguno de los ejemplos muestra si es necesario o no. (Disculpe: python, C#, C++ background, todos los cuales requieren que use una sintaxis alternativa o manualmente cierre las secuencias). – Crisfole

+1

Tiene razón, @ChristopherPfohl: de los documentos, stdin/out/err.close # stdin, stdout y stderr deben cerrarse explícitamente en este formulario. Sin embargo, también puede usar el formulario de bloque que se cerrará automáticamente. – gregoltsov

Cuestiones relacionadas