Bei der Erstellung von Bash-Skripten kommt es oft vor, dass du das Skript beenden möchtest, sobald bestimmte Kriterien erfüllt sind oder eine Aktion basierend auf dem Abschlusscode eines Befehls durchgeführt werden soll.
In diesem Beitrag werden wir uns den in Bash integrierten exit
-Befehl und die Beendigungsstatus der ausgeführten Befehle ansehen.
Abschlussstatus
Alle Shell-Befehle liefern einen Abschlusscode, wenn sie erfolgreich oder erfolglos abgeschlossen werden.
Ein Abschlusscode von Null zeigt an, dass der Befehl erfolgreich abgeschlossen wurde, während ein Wert ungleich Null auf einen Fehler hinweist.
Die spezielle Variable $?
liefert den Beendigungsstatus des zuletzt ausgeführten Befehls:
date &> /dev/null
echo $?
Der date
-Befehl wurde erfolgreich ausgeführt und der Abschlusscode ist Null:
0
Wenn du versuchst, ls
in einem nicht vorhandenen Verzeichnis auszuführen, wird der Abschlusscode ungleich Null sein:
ls /nicht_vorhandenes_verzeichnis &> /dev/null
echo $?
2
Der Statuscode kann dazu verwendet werden, die Ursache des Fehlers zu ermitteln. Die Manpage jedes Befehls enthält Informationen zu den Abschlusscodes.
Wenn du eine Befehls-Pipeline mit mehreren Befehlen ausführst, entspricht der Abschlussstatus der Pipeline dem des letzten Befehls:
sudo tcpdump -n -l | tee file.out
echo $?
In dem obigen Beispiel gibt echo $?
den Abschlusscode des tee
-Befehls aus.
Bash exit
Befehl
Der exit
-Befehl beendet die Shell mit einem Status von N
und hat folgende Syntax:
exit N
Wenn N
nicht angegeben ist, entspricht der Abschlussstatus dem des zuletzt ausgeführten Befehls.
Wird es in Shell-Skripten verwendet, gibt der als Argument für den exit
-Befehl angegebene Wert den Abschlusscode an die Shell zurück.
Beispiele
Der Abschlusscode eines Befehls kann in bedingten Anweisungen wie if
verwendet werden. Im folgenden Beispiel wird grep
mit Null beendet (was in Shell-Skripten als wahr gilt), wenn die Zeichenkette in dateiname.txt
gefunden wird:
if grep -q "beliebiger string" dateiname.txt; then
echo "Zeichenkette gefunden."
else
echo "Zeichenkette nicht gefunden."
fi
Wenn du eine Liste von Befehlen ausführst, die durch &&
(UND) oder ||
(ODER) getrennt sind, bestimmt der Abschlussstatus des Befehls, ob der nächste Befehl in der Liste ausgeführt wird. Hier wird der mkdir
-Befehl nur ausgeführt, wenn cd
den Wert Null zurückgibt:
cd /opt/code && mkdir project
Wenn ein Skript mit exit
endet, ohne dass ein Parameter angegeben wird, entspricht der Abschlusscode des Skripts dem des zuletzt ausgeführten Befehls im Skript.
#!/bin/bash
echo "doing stuff..."
exit
Nur exit
zu verwenden, entspricht dem Gebrauch von exit $?
oder dem Weglassen von exit
.
Hier ist ein Beispiel, das zeigt, wie das Skript beendet wird, wenn es von einem Nicht-Root-Benutzer aufgerufen wird:
#!/bin/bash
if [[ "$(whoami)" != "root" ]]; then
echo "Nur der Root-Benutzer kann dieses Skript ausführen."
exit 1
fi
echo "doing stuff..."
exit 0
Wenn du das Skript als Root-Benutzer ausführst, ist der Abschlusscode gleich null. Andernfalls wird das Skript mit dem Status 1
beendet.
Fazit
Jeder Shell-Befehl liefert einen Abschlusscode, wenn er beendet wird. Der exit
-Befehl wird verwendet, um eine Shell mit einem bestimmten Status zu beenden.
Wenn du Fragen oder Anregungen hast, kannst du gerne einen Kommentar hinterlassen.