2013-02-22 5 views
15

Ich stehe fest, versucht zu sein, den Exit-Status eines Shell-Befehls zu erhalten, der von der Open3.popen3() - Methode von Ruby gestartet wurde.Wie kann ich den Beendigungsstatus von Ruby Open3.popen3() abrufen?

Hier ist mein Code:

require 'open3' 
stdin, stdout, stderr = Open3.popen3('ls') 

Als ich Zugang versuchen jetzt $? es noch nil ist

Ist es möglich, den Exit-Status, nachdem alle abzurufen?

Hinweise:
- ls ist nicht der Befehl, den ich versuche, in meinem Skript zu verwenden. Ich habe das nur benutzt, um ein Beispiel zu geben. Mein Skript ist etwas komplexer und enthält Benutzereingaben, weshalb ich die Desinfektionsfunktion von Open3 benötige.
- Ich habe auch die Block-Variante von popen3 ausprobiert, aber das ist mir auch nicht gelungen.

Antwort

16

popen3 Ausbeuten/kehrt vier Parameter, stdin, stdout, stderr und wait_thr. wait_thr enthält eine Methode wait_thr.value, die den Exit-Status des Befehls zurückgibt (tatsächlich ist es ein Process::Status Objekt gemäß Dokumentation). Auch einen Blick auf http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3

+4

wusste ich, dass OPEN3 auch einen Thread gibt, aber nicht wissen, wie ihre Exit-Code zu erhalten. 'wait_thr.value.success?' funktioniert wie ein Zauber, vielen Dank! – Griddo

15

Die kurze Antwort ist, den 4. Parameter von OPEN3 zu verwenden: wait_thr

  • erhalten, ob ein Fehler angezeigt wird: wait_thr.value.success?
  • die tatsächliche Fehlerstufe erhalten: wait_thr.value.exitstatus

Probe:

Open3.popen3(command) do |stdin, stdout, stderr, wait_thr| 
    return_value = wait_thr.value 
end 
puts "Error level was: #{return_value.exitstatus}" unless return_value.success? 
+0

Hat diese Antwort gewählt, weil sie ein Codebeispiel enthält. Vielen Dank! –

0

Alles, was Sie (Standardausgabe, Fehler- und Exit-Code) in drei Zeilen benötigen:

require 'open3' 
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5; ls") 
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}" 
Verwandte Themen