Wie Linux-Austrittscodes Ihnen helfen, robuste Skripte zu schreiben

Diese Einführung erklärt die Nutzung von Rückgabewerten in Linux-Befehlen und Skripten, um den Programmfluss zu steuern und robuste Fehlerbehandlung zu gewährleisten.
Zusammenfassung
- Jeder Linux-Befehl gibt einen Rückgabewert aus, wobei 0 Erfolg und Nicht-Null-Werte Misserfolg anzeigen.
- Sie können die Variable $? verwenden, um den Rückgabewert abzurufen und den Programmfluss in Skripten zu steuern.
- Seien Sie vorsichtig bei unkonventionellen Rückgabewerten, die zwischen Befehlen variieren, wie diff und curl.
Jeder Linux-Befehl gibt Fehlermeldungen aus, wenn er fehlschlägt, jedoch ist diese Information schwierig zu nutzen. Ihre Skripte sollten Rückgabewerte verwenden, um so robust wie möglich zu sein.
Was Sind Rückgabewerte?
Wenn Sie einen Linux-Befehl ausführen, kann dieser fehlschlagen. Verschiedene Gründe können dazu führen, dass Dinge schiefgehen, aber normalerweise sehen Sie eine Nachricht, die erklärt, warum:
Die Fehlermeldung erscheint auf STDERR, einem anderen Stream als STDOUT, wodurch Sie Fehler von der erwarteten Ausgabe isolieren können. Als Benutzer sollte die Beschreibung des Fehlers informativ sein, jedoch benötigen Skripte und andere automatisierte Prozesse eine zuverlässigere Fehlererkennung.
Neben lesbaren Fehlermeldungen gibt jeder Befehl auch einen Rückgabewert zurück. Dies ist eine Zahl zwischen 0 und 255, die angibt, ob der Befehl fehlgeschlagen oder erfolgreich war. Standardmäßig ist der Rückgabewert verborgen, aber Ihre Shell bietet Zugriff auf diesen Wert über die spezielle Variable $?.
Beachten Sie, dass ein Wert von 0 Erfolg anzeigt und ein Nicht-Null-Wert Misserfolg bedeutet. Sie können diesen Wert in der Befehlszeile überprüfen, in einem Skript abfragen und verwenden, um den Fluss Ihrer Programme zu steuern.
Wie Nutze Ich Rückgabewerte?
Im obigen Beispiel gab ls einen Rückgabewert von 0 zurück, wenn er erfolgreich war, und 1, wenn sein Argument keine gültige Datei war. Das mag kontraintuitiv erscheinen und widerspricht typischen Programmiersprachen, die 0 als falschen Wert und 1 als wahren Wert behandeln. Diese Einrichtung ermöglicht jedoch einen universellen Erfolgswert und eine Vielzahl von Werten für unterschiedliche Fehlertypen.
Zusätzlich dazu, dass Sie die Variable $? abfragen, um den Rückgabestatus manuell zu überprüfen, können Sie sie mit einer bedingten if-Anweisung verwenden. Gibt der Befehl einen Rückgabestatus von 0 zurück, wird der zugehörige then-Block ausgeführt. Andernfalls wird, sofern vorhanden, der else-Block ausgeführt. Zum Beispiel:
if command; then echo "Befehl erfolgreich"; else echo "Befehl fehlgeschlagen"; fi
Sie können diese Anweisung in einem Shell-Skript verwenden, wo es etwas einfacher ist, die Lesbarkeit zu formatieren:
if command
then echo "Befehl erfolgreich"
else echo "Befehl fehlgeschlagen"
fi
Dies ist das Äquivalent von:
command
if [ $? -eq 0 ]
then echo "Befehl erfolgreich"
else echo "Befehl fehlgeschlagen"
fi
Die längere Version verwendet die Syntax mit eckigen Klammern, um den Wert von $? zu testen, aber in der Regel ist es einfacher, den Wert direkt zu überprüfen, wie im ersten Fall. Denken Sie daran, dass $? immer den Rückgabewert des letzten Befehls darstellt, also seien Sie vorsichtig. Möglicherweise werden Sie versucht sein, den Wert von $? zur Fehlersuche auszugeben, z. B.
command
echo "Befehl gab Rückgabewert zurück:" $?
if [ $? -eq 0 ]
then echo "Befehl erfolgreich"
else echo "Befehl fehlgeschlagen"
fi
Aber zum Zeitpunkt der Bedingungsprüfung wird $? den Wert des Rückgabestatus von echo haben, der fast garantiert 0 ist. Um dies zu vermeiden, testen Sie entweder den Befehl direkt in der Bedingung oder speichern Sie den Wert von $? in einer Variablen.
Was Gibt Es Sonst Zu Wissen Über Den Rückgabewert?
Rückgabewerte sind ziemlich einfach und folgen dem Unix-Prinzip, was Teil ihrer Stärke ist. Aber es gibt einige Tücken und Ausnahmefälle, über die Sie Bescheid wissen sollten.
Rückgabewerte Aus Ihrer Shell
Ihre Shell verwendet Rückgabewerte, selbst wenn der von Ihnen eingegebene Befehl nicht korrekt ausgeführt wird. Zum Beispiel verwenden zsh und bash 127, wenn der Befehl nicht gefunden wurde, und 126, wenn der Befehl nicht ausführbar ist:
Unkonventionelle Rückgabewerte
Einige Befehle weichen etwas von den Regeln des Rückgabewerts ab; es sind schließlich nur Konventionen. Zum Beispiel nutzt diff einen Wert von 0, um "keine Unterschiede" anzuzeigen, einen Wert von 1 für "Unterschiede" und einen Wert von 2, um einen Fehler darzustellen:
Das kann die Bedeutung von Bedingungen verwirren; zum Beispiel:
if diff file1 file2; then
echo diese Dateien sind gleich!
fi
Der Befehl curl ist ebenfalls etwas unintuitiv. Sie könnten erwarten, dass curl einen HTTP-Fehler wie einen 404 für eine nicht existierende Datei meldet.
Die URL hat einen Statuscode ungleich Null, tut es aber nicht:
Sie können die -f (--fail) Option verwenden, um curl dazu zu bringen, sich anders zu verhalten und einen Exit-Code von 22 im Fehlerfall zurückzugeben:
Seien Sie sich jedoch bewusst, dass dies nicht zu 100 % garantiert ist und einige HTTP-Fehler, einschließlich solcher, die eine Authentifizierung erfordern, weiterhin einen Exit-Code von 0 zurückgeben.
Verwendung des Exit-Status in einer Befehlskette
Eine der besten Abkürzungen des Exit-Status geschieht, ohne dass Sie darüber nachdenken müssen. Hier ist ein einfaches Beispiel:
ls program && ./program && echo Erfolg || echo epischer Fehler
Die logischen Operatoren && und || ermöglichen es Ihnen, mehr als einen Befehl basierend auf dem Exit-Status anderer auszuführen. Sie ähneln den entsprechenden Operatoren in den meisten Programmiersprachen, aber sie respektieren die Exit-Code-Konvention. Der && Operator führt den Befehl auf seiner rechten Seite nur aus, wenn der Befehl auf seiner linken Seite einen Exit-Status von 0 zurückgibt. Der || Operator führt den Befehl auf seiner rechten Seite nur aus, wenn der Befehl auf seiner linken Seite mit einem nicht-null Status fehlschlägt.
Ein sehr häufiger Fall tritt auf, wenn Sie Software von Grund auf neu erstellen, indem Sie folgendes Rezept verwenden:
./configure && make && make install
Die drei Teile dieses Befehls tun Folgendes:
- ./configure führt ein lokales Skript aus, das Ihre Umgebung überprüft und eine Makefile generiert.
- make führt das Make-Programm aus und erstellt die Software unter Verwendung des Makefile.
- make install kopiert die generierte ausführbare Datei an einen bekannten Ort wie /usr/local/bin.
Wenn ein Teil dieses Prozesses fehlschlägt, wird er sofort gestoppt, ohne den Rest auszuprobieren.
Die Befehle true und false
Ihr Linux-System umfasst zwei kuriose Befehle: true und false. Jeder dieser Befehle tut nichts, außer den entsprechenden Exit-Code zurückzugeben: 0 und 1:
Sie scheinen vielleicht nicht sehr nützlich zu sein, aber diese Befehle sind hilfreich zum Testen und für einige Shell-Scripting-Aufgaben. Sie können true in einer while-Anweisung verwenden, um eine Endlosschleife zu erstellen:
while true
do
echo “läuft bis Sie ^c drücken”
sleep 10
done
Sie können sie auch zusammen mit logischen Operatoren verwenden, um das Verhalten von Befehlen zu ändern. Zum Beispiel können Sie eine lange Befehlsfolge vorübergehend anhalten:
false && (none || of-these && commands || will-run)
Oder Sie können eine Befehlsfolge dazu zwingen, weiterhin zu laufen, auch wenn ein Befehl fehlschlägt:
cat file-that-may-not-exist | true && echo fertig
Rückgabe eines Exit-Codes aus Ihren eigenen Skripten
Sie haben wahrscheinlich bereits den Befehl exit verwendet, um Ihr Terminal zu verlassen. Technisch gesehen verlässt es Ihre Shell, und das bedeutet, dass Sie es auch verwenden können, um ein Shell-Skript zu beenden. Standardmäßig beenden Ihre Skripte mit dem gleichen Code wie der letzte Befehl:
Sie können jedoch den Exit-Code ändern, indem Sie einen numerischen Parameter an den Befehl exit übergeben:
exit number
Ihr Skript wird nun mit dem Statuscode, den Sie bereitgestellt haben, beendet, und Sie können dies verwenden, um verschiedene Fehlerbedingungen von Ihrem Programm an andere zu kommunizieren.
Sobald Sie von ihnen wissen, sind Exit-Befehle einfach zu verwenden. Sie können sie sogar verwenden, ohne wirklich darüber nachzudenken, aber wenn es ums Scripting geht, stellen Sie sicher, dass Sie die Exit-Codes angemessen verwenden.
Bist du neugierig auf weitere Artikel wie Wie Linux-Austrittscodes Ihnen helfen, robuste Skripte zu schreiben? Entdecke spannende Inhalte in der Kategorie Linux.
Schreibe einen Kommentar