Ich habe eine Reihe von Systemaufrufen in Ruby wie die folgenden und möchte deren Exit-Codes gleichzeitig überprüfen, damit mein Skript beendet wird, wenn dieser Befehl fehlschlägt.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Ich möchte so etwas wie
system("VBoxManage createvm --name test1", 0)
<- wobei der zweite Parameter den Exit-Code überprüft und bestätigt, dass dieser Systemaufruf erfolgreich war, und wenn nicht, wird ein Fehler ausgelöst oder etwas in dieser Art ausgeführt.
Ist das überhaupt möglich?
Ich habe etwas in dieser Richtung versucht und das hat auch nicht funktioniert.
system("ruby test.rb")
system("echo $?")
oder
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
wird eine Zeichenfolge sein - entweder"0\n"
oder"1\n"
, soexit_code != 0
wird es immer wahr seinAntworten:
Aus der Dokumentation :
Außerdem
quelle
[10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
system
Backticks%x
undexec
wird hier bereitgestellt: stackoverflow.com/questions/6338908/…Für mich zog ich es vor, `` zu verwenden, um die Shell-Befehle aufzurufen und $? um den Prozessstatus zu erhalten. Die $? Ist ein Prozessstatusobjekt, können Sie die Prozessinformationen des Befehls von diesem Objekt abrufen, einschließlich: Statuscode, Ausführungsstatus, PID usw.
Einige nützliche Methoden des $? Objekt:
quelle
$?
ist$CHILD_STATUS
system
Gibt zurück,false
wenn der Befehl einen Exit-Code ungleich Null hat odernil
wenn kein Befehl vorhanden ist.Deshalb
oder
sollte funktionieren und sind einigermaßen prägnant.
quelle
Sie erfassen nicht das Ergebnis Ihres
system
Anrufs. Hier wird der Ergebniscode zurückgegeben:Denken Sie daran, dass bei jedem
system
Aufruf oder Äquivalent, zu dem auch die Backtick-Methode gehört, eine neue Shell erzeugt wird, sodass das Ergebnis der Umgebung einer vorherigen Shell nicht erfasst werden kann. In diesem Fallexit_code
ist,true
wenn alles geklappt hat,nil
sonst.Der
popen3
Befehl bietet mehr Details auf niedriger Ebene.quelle
Open3.capture3
ist eine besonders einfache Methode für diese Art von Aufgabe.Eine Möglichkeit, dies zu tun, besteht darin, sie mit
and
oder zu verketten&&
:Der zweite Aufruf wird nicht ausgeführt, wenn der erste fehlschlägt.
Sie können diese in eine einwickeln
if ()
, um eine gewisse Flusskontrolle zu erhalten:quelle