mit
time sleep 1
Ausbeuten:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
Gibt es einen Befehl, mit dem ich den Exit-Code sleep
oder einen beliebigen Befehl drucken kann, den ich ausführen möchte?
Etwas mag:
$ log-exit-code sleep 1
vielleicht reicht das aus?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
quelle
quelle
sleep 1 && echo $?
würde den Code der Schlafzelle nur drucken, wenn er Null ist ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Antworten:
In meinen bisherigen Tests hat dies funktioniert:
command && echo "$?" || echo "$?"
Weist es einfach an, den Exit-Code zu wiederholen, wenn er erfolgreich ist oder fehlschlägt.
Wie Sato weiter unten ausführte, ist dies im Wesentlichen dasselbe wie:
command; echo "$?"
Eine Sache, die das und / oder den Befehl lohnenswert machen könnte, ist so etwas wie:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Wenn Sie Ihr Skript benötigen, um auf den Exit-Code zu reagieren, wie es Olivier betrifft, ist dies kein Problem. Ihr Skript könnte ungefähr so aussehen:
quelle
command; echo $?
?command; echo $?
ist eine viel bessere Antwort.command ; echo $?
weilecho $?
immer erfolgreich ist und daher danach der neue Wert von $? ist jetzt 0. Es gibt eine Möglichkeit, den ursprünglichen Rückkehrcode auch nach der Anzeige beizubehalten, falls dieser ursprüngliche Rückkehrcode später nützlich ist (Beispiel: In einem Skript ist es wichtig, den Rückkehrcode zu überprüfen, bevor Sie entscheiden, wie Sie fortfahren möchten). Siehe meine Antwort für eine von mehreren Lösungen (die meisten Antworten hier können auf die gleiche Weise geändert werden)cmd && echo "$?"
würde nicht funktionieren, da es notwendigerweise nur Nullen druckenecho
würde (die würden nur nach erfolgreichem Abschluss des vorhergehenden Befehls ausgeführt).Hier ist eine kurze Shell-Funktion für Sie:
Dadurch wird der Exit-Code des angegebenen Befehls auf ähnliche Weise wie beim
time
Befehl gedruckt.Durch Umleiten des
printf
to/dev/tty
in die Funktion können wir weiterhintellexit
Umleitungen verwenden, ohne dass Junk in unseren Standardausgabe- oder Fehlerströmen auftritt:Durch Speichern des Exit-Codes in einer Variablen können wir ihn an den Aufrufer zurückgeben:
Eine schickere Version derselben Funktion gibt auch das Signal aus, das den Befehl beendet hat, wenn der Exit-Code größer als 128 ist (was bedeutet, dass er aufgrund eines Signals beendet wurde):
Testen:
(Das
local
Ding erfordertash
/pdksh
/bash
/zsh
, oder Sie können es ändern,typeset
was auch einige andere Muscheln verstehen.)quelle
Verwenden Sie eine Shell-Wrapper-Funktion. Wahrscheinlich mit einem anderen Namen.
(Dies wird natürlich die Standardausgabe
tty
beschädigen. Verwenden Sie daher entweder die von @Kusalananda gezeigte oder nicht außerhalb interaktiver Kontexte.)Auf dem Weg in ein nicht portierbares Gebiet können einige Shells den Status aller Befehle in einer Pipeline melden, nicht nur den letzten, z. B. in ZSH, wenn Fehler aus einer gesamten Pipeline gemeldet werden sollen:
TRAPZERR
Andernfalls wird nicht ausgelöst, wenn kein Fehler vorliegt (im Prinzip "Keine Nachrichten sind gute Nachrichten").quelle
GNU
time
hat hierfür eine Option:Durchläuft den Exit-Code 1 , sofern er nicht durch ein Signal 2 getötet wird :
Wenn Sie die Signal-Kill-Situation kennen / behandeln möchten, übergeben Sie
-v
den stderr und suchen Sie nach dem StringCommand terminated by signal
.1 Vielen Dank an Olivier Dulac für die Notiz, dass der Exit-Code durchläuft.
2 Vielen Dank auch an Stéphane Chazelas für den Hinweis, dass der Exit-Code für das Kill-Signal nicht durchgeht.
quelle
0
jedoch zurückgegeben, wenn der Befehl beendet wird.256+signum
oder384+signum
oder sogarsignum/256
odersignum/256+0.5
ob ein Kern generiert wurde (tatsächlich wird der Status durchwaitpid()
dividiert durch 256 zurückgegeben). Einige würden eine Textdarstellung geben (wiesigint
odersigquit+core
). Es lohnt sich wahrscheinlich immer noch, in der Newsgroup gnu.coreutils.bugs zu diskutieren.time
nicht Teil voncoreutils
, es ist ein Paket für sich mit einer eigenen Bug-Mailing-Liste ([email protected]))system()
von traditionellen awks wie die, die noch von Brian Kernighan (thek
inawk
) gepflegt werden, oder dienawk
von Solaris, dieawk
von FreeBSD, die sich daraus ableiten.awk 'BEGIN{print system("kill -s ABRT $$")}'
Wird ausgegeben,0.523438
wenn die Größe des Core-Dumps nicht begrenzt ist. Das Verhalten vongawk
hat sich in letzter Zeit geändert, mit unterschiedlichem Verhalten mit--traditional
oder--posix
(siehe auch den Rückgabewert vonclose(cmd)
für weitere Variationen)Ich mag alle anderen Antworten nicht (obwohl ich ihre Klugheit sehr mag): Sie zeigen den Exit-Code an, aber sie ÄNDERN ihn auch. (Der anzeigende Teil ist wahr, daher ist der Rückkehrcode danach 0)
Hier ist eine modifizierte Version:
quelle
time
die nicht immer verfügbar ist.Um etwas robuster zu sein, senden Sie den Exit-Status an einen separaten FD, damit er unabhängig von stdout / stderr behandelt werden kann:
Beachten Sie, dass Sie etwas mit FD3 tun müssen, sonst wird es sagen
Bad file descriptor
.Dies könnte weiter konfiguriert werden, um diese Ausgänge für Eingänge eines anderen Programms bereitzustellen, indem das andere Programm mehr als einen FD abhört; Sie könnten dies als eine Art Kibana der frühen 90er verwenden :)
quelle
Während alle anderen (sehr interessanten) Antworten genau die Frage betreffen, die das OP gestellt hat, sind die Dinge in der Praxis normalerweise einfacher. Sie speichern den Exit-Status einfach in einer Variablen (unmittelbar nach dem Befehl) und melden oder protokollieren ihn nach Ihren Wünschen. ZB in / dev / stderr drucken oder als Textnachricht in eine Protokolldatei schreiben / anhängen. Außerdem wird es für die Entscheidungsfindung / Flusskontrolle im nachfolgenden Code beibehalten.
Wenn es in einer Funktion ist:
Wenn es direkt in einem Skript ist:
(Ducken und Bedecken, da dies nicht die genaue Frage beantwortet .)
quelle