Einführung
Stellen Sie sich vor, Sie bitten jemanden jedes Mal um eine Aufgabe und erhalten anschließend eine kleine Karte.
- Eine grüne Karte (0) bedeutet: „Ich habe die Aufgabe perfekt erledigt.“
- Eine rote Karte (1–255) bedeutet: „Etwas ist schiefgegangen.“
Unter Linux funktioniert jeder Befehl genau so. Diese Rückmeldung wird Exit-Code oder Exit-Status genannt.
0: Erfolg.Nicht 0: Fehler.
Die meisten Anfänger beachten diese Codes nicht, weil sie normalerweise unsichtbar sind, solange Sie nicht ausdrücklich danach fragen. Erfahrene Skriptautoren achten genau darauf, denn der Exit-Status ist eine der wichtigsten Möglichkeiten der Shell, Erfolg oder Fehler zwischen Befehlen und Skripten zu melden.
Dies ist ein grundlegendes Unix-Entwurfsmuster: Kleine Programme kommunizieren über einfache Konventionen miteinander. Text kann über die Standardausgabe weitergegeben werden, während Erfolg oder Fehler über den Exit-Status übermittelt wird. Deshalb sind Exit-Codes in der Automatisierung so wichtig.
In diesem Lab lernen Sie, diese geheimen Karten mithilfe der Variable $? zu lesen und Ihre Skripte zu beenden, bevor sie Schaden anrichten.
Befehlsstatus mit $? prüfen
Wie können Sie diese unsichtbare „Bewertung“ anzeigen? Sie lesen direkt nach der Ausführung eines Befehls eine spezielle Variable namens $? aus.
Sehen wir uns zuerst einen erfolgreichen Befehl an.
Öffnen Sie Ihr Terminal und listen Sie Ihre Dateien auf:
ls -l
Der Befehl wurde erfolgreich ausgeführt, richtig? Fragen wir nun: „Wie war die Bewertung?“
echo $?
Sie sollten 0 sehen. In der Linux-Logik steht 0 für die Anzahl der Fehler. Keine Fehler bedeuten vollständigen Erfolg.
Erzwingen Sie nun einen Fehler. Versuchen Sie, eine Datei aufzulisten, die nicht existiert:
ls ghosts.txt
Linux meldet, dass die Datei nicht gefunden werden kann. Fragen Sie nun erneut nach der Bewertung:
echo $?
Sie sehen 2. Der Wert ist nicht 0, also ist der Befehl fehlgeschlagen.
Die genaue Zahl ungleich null kann je nach Befehl und Situation variieren. Für den Moment gilt jedoch die wichtigste Regel: 0 bedeutet Erfolg, jeder andere Wert bedeutet Fehler. Später, wenn Sie mit Skripten und Tools arbeiten, werden Sie sehen, dass manche Programme unterschiedliche Werte ungleich null verwenden, um verschiedene Fehlerarten zu kennzeichnen.
Wichtige Regel: $? ist ein Kurzzeitgedächtnis. Die Variable speichert nur das Ergebnis der allerletzten Aktion. Wenn Sie zuerst ls ausführen und der Befehl fehlschlägt, danach echo "hello" ausführen und anschließend $? prüfen, sehen Sie 0, weil echo erfolgreich war. Sie müssen den Wert sofort prüfen.
Ein fehlschlagendes Skript erstellen
Hier liegt die Gefahr. Standardmäßig ignoriert ein Skript rote Karten und läuft einfach weiter.
Stellen Sie sich ein Skript mit folgenden Schritten vor:
- Erstellen Sie eine Sicherung.
- Löschen Sie die Originaldateien.
Wenn Schritt 1 fehlschlägt, weil die Sicherung keinen Speicherplatz mehr hat, wird Schritt 2 trotzdem ausgeführt und Sie verlieren alle Daten.
Simulieren wir dieses „blinde Skript“.
Erstellen Sie copy_script.sh:
nano copy_script.sh
Geben Sie diesen Code ein. Er versucht, eine nicht vorhandene Datei zu kopieren, und meldet anschließend trotzdem Erfolg.
#!/bin/bash
## Attempt to copy a ghost
cp ghost_file.txt destination.txt
## Print a happy message
echo "Script finished execution"
Speichern und schließen Sie die Datei. Machen Sie sie ausführbar:
chmod +x copy_script.sh
Führen Sie das Skript aus:
./copy_script.sh
Sie sehen die Fehlermeldung von cp, anschließend aber auch „Script finished execution“. Das Skript ist fehlgeschlagen, läuft aber trotzdem weiter!
Prüfen Sie den Exit-Status des Skripts selbst:
echo $?
Der Wert ist 0. Warum? Weil der letzte Befehl (echo) erfolgreich war. Dieses Skript täuscht das System. Seine Hauptaufgabe ist fehlgeschlagen, trotzdem meldet es Erfolg.
Das ist eine wichtige Erkenntnis: Auch ein Shell-Skript besitzt einen Exit-Status. Wenn Sie nichts Besonderes festlegen, entspricht dieser häufig dem Exit-Status des zuletzt ausgeführten Befehls. Deshalb kann ein Skript einen früher aufgetretenen Fehler versehentlich verbergen.
Fehlerbehandlung implementieren
Wir müssen unserem Skript beibringen, bei einer roten Karte anzuhalten.
Typischerweise verwenden wir folgende Struktur: „Führe Befehl X aus. Wenn der Exit-Code NICHT 0 ist, brich ab.“
Die Syntax [ $? -ne 0 ] verwendet den Befehl test in seiner Schreibweise mit eckigen Klammern. -ne bedeutet bei Zahlen „ungleich“. Die Shell fragt also: „Ist der Exit-Status des vorherigen Befehls ungleich null?“
Bearbeiten Sie das Skript copy_script.sh:
nano copy_script.sh
Ändern Sie den Inhalt in:
#!/bin/bash
cp ghost_file.txt destination.txt
## Check if the score is NOT equal (-ne) to 0
if [ $? -ne 0 ]; then
echo "Error: The copy operation failed!"
exit 1
fi
echo "Script finished execution"
Aufschlüsselung:
if [ $? -ne 0 ]: Die Prüfung kontrolliert die Karte.exit 1: Der rote Knopf. Dieser Befehl beendet das Skript sofort und setzt den globalen Exit-Status auf 1 (Fehler).
Der Befehl exit beendet das aktuelle Shell-Skript und gibt diese Zahl an das Programm zurück, das es gestartet hat, etwa Ihr Terminal, ein anderes Skript oder ein Automatisierungssystem. Sie beenden also nicht nur die lokale Ausführung, sondern melden den Status auch an die Außenwelt.
Speichern und schließen Sie die Datei.
Führen Sie das Skript erneut aus:
./copy_script.sh
Das Skript gibt den Fehler aus und wird beendet. Es gibt nicht „Script finished execution“ aus.
Prüfen Sie den Exit-Status:
echo $?
Der Wert ist 1. Jetzt meldet das Skript seinen Fehler korrekt.
Zusammenfassung
Sie haben gelernt, die geheime Sprache der Befehle zu verstehen.
In diesem Lab haben Sie Folgendes geübt:
- Bewertungen lesen: Mit
$?prüfen, ob ein Befehl erfolgreich war (0) oder fehlgeschlagen ist (1–255). - Täuschende Skripte erkennen: Verstehen, wie Skripte Fehler verbergen können, wenn Sie nicht sorgfältig prüfen.
- Als Schiedsrichter eingreifen: Mit
exit 1die Ausführung beenden, sobald ein Fehler auftritt.
Dieses Muster „Prüfen und beenden“ unterscheidet ein unzuverlässiges Skript von einem professionellen Skript.



