2010-08-28 10 views
7

Devo eseguire un comando shell dallo script Ruby, ma devo recuperare l'output in modo che possa usarlo nello script in seguito.Restituisce l'output dal comando "system" in Ruby?

Ecco il mio codice:

output = system "heroku create" # => true 

Ma il comando di sistema restituisce un valore booleano e non l'uscita.

Detto semplicemente, il sistema "heroku create" deve uscire sul mio schermo (cosa che fa) ma restituire anche l'output in modo che possa elaborarlo.

+0

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

risposta

8

La biblioteca Open3 ti permetterà di accedere ai flussi IO standard (STDIN, stdout e stderr). Fa parte di Ruby, quindi non c'è bisogno di installare una gemma:

require 'open3' 

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

oppure è possibile utilizzare il modulo di blocco che chiude i flussi implicitamente:

require 'open3' 

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

Vedere la Open3 documentation per tutti i dettagli.

Modifica: aggiunti ulteriori dettagli di chiusura del flusso. Grazie Christopher e Gregory.

+1

Non sei tu? supposto per 'chiudere' questi? Sto cercando la documentazione su questo, e nessuno degli esempi mostra se è necessario o meno. (Ci scusiamo per python, C#, C++ background, che richiedono tutti di usare una sintassi alternativa o chiudere manualmente i flussi). – Crisfole

+1

Hai ragione, @ChristopherPfohl: dai documenti, 'stdin/out/err.close # stdin, stdout e stderr dovrebbero essere chiusi esplicitamente in questo modulo. Tuttavia, puoi anche utilizzare il modulo a blocco che verrà chiuso automaticamente. – gregoltsov

Problemi correlati