1. Startseite
  2. Bash Skript
  3. Bash exit Befehl und Exit-Codes

Bash exit Befehl und Exit-Codes

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.txtgefunden 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.

War dieser Beitrag hilfreich?

Verwandte Beiträge