2010-08-28 18 views
7

Ich muss einen Shell-Befehl aus Ruby-Skript ausführen, aber ich muss die Ausgabe abrufen, damit ich es später im Skript verwenden kann.Ausgabe von "System" -Befehl in Ruby zurückgeben?

Hier ist mein Code:

output = system "heroku create" # => true 

Aber das System Befehl gibt eine boolean und nicht die Ausgabe.

Einfach gesagt, System "heroku create" muss auf meinem Bildschirm ausgeben (was es tut) aber auch die Ausgabe zurückgeben, damit ich es verarbeiten kann.

+0

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

Antwort

8

Die Open3 Bibliothek gibt Ihnen vollen Zugriff auf die Standard-IO-Streams (STDIN, STDOUT und STDERR). Es ist ein Teil von Ruby, so gibt es keine Notwendigkeit, ein Juwel zu installieren:

require 'open3' 

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

oder können Sie die Blockform verwendet werden, die implizit die Streams schließt:

require 'open3' 

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

Siehe Open3 documentation für die vollständigen Details.

Bearbeiten: Zusätzliche Stream-Abschlussdetails hinzugefügt. Danke Christopher und Gregory.

+1

Bist du nicht soll diese "schließen"? Ich suche nach einer Dokumentation darüber, und keines der Beispiele zeigt, ob oder nicht. (Sorry: Python, C#, C++ - Hintergrund, alle erfordern, dass Sie eine alternative Syntax verwenden oder Streams manuell schließen). – Crisfole

+1

Sie haben Recht, @ChristopherPfohl: aus den Dokumenten, 'stdin/out/err.close # stdin, sollten stdout und stderr explizit in diesem Formular geschlossen werden.'. Sie können jedoch auch das Blockformular verwenden, das automatisch geschlossen wird. – gregoltsov