Im letzten Teil habe ich dir gezeigt, wie du Parameter von außen in dein Script übergeben kannst. Die exit Codes machen das genaue Gegenteil, sie geben nach Durchlauf des Scripts Informationen zurück.
1 | Einführung |
---|---|
2 | Der bash Prompt |
3 | key bindings |
4 | Der Startvorgang |
5 | Environment Variablen |
6 | builtin commands |
7 | Arbeiten mit Dateien |
8 | nano |
9 | bash Scripting |
10 | Variablen |
11 | Verzweigungen (if) |
12 | Schleifen |
13 | Kommandozeilenparameter |
14 | exit Codes bash Tutorial Teil 14 |
15 | von der Idee zum Script |
16 | grep |
17 | Piping und Redirection |
18 | tee |
exit Codes
Der exit Code ist der Rückgabewert eines Scripts an den aufrufenden Prozess.
exit Kommando
Das builtin exit
Kommando dient dazu, den Rückgabewert zu übermitteln.
Dazu ein einfach Beispiel
# /usr/bin/bash
echo "Beispiel für exit Code"
exit 2
Das Script gibt nur einen belanglosen Text aus und setzt dann seinen exit Code auf 2, was normalerweise auf einen Fehler im Script hindeutet.
Variable ${?}
Die bash legt den Rückgabewert des zuletzt ausgeführten Scripts in der Spezialvariable ${?}
ab
Dies gilt auch für die Kommandos, die von deinem eigenen Script aufgerufen werden. Wenn du dies nicht mit exit überschreibst, steht nach Beendigung deines Scripts in ${?} der exit Code des zuletzt ausgeführten Kommandos. In simpleexit.sh liefert das echo
Kommando den exit Code 0
, den wir dann mit exit 2
überschreiben.
Behandlung von exit-Codes
Meist fragst du den exit Code ab, um in deinem Script auf den Fehler eines aufgerufenen Kommandos zu reagieren.
Wir erstellen uns jetzt ein Script sub.sh, das aufgerufen wird. über einen Parameter können wir steuern, welchen exit Code das Script liefert.
# !/usr/bin/bash
if [ "${1}" == "fail" ]; then
echo " ${0}: failing"
exit 1
fi
exit 0
Du siehst, dass die Variable ${?}
davon abhängt, welchen exit Code sub.sh setzt.
sub.sh wird jetzt im Script ifexit.sh benutzt, um auf den Status zu reagieren:
#! /usr/bin/bash
./sub.sh ${1}
if [ ${?} -eq 0 ]; then
echo "sub.sh erfolgreich"
else
echo "sub.sh fehlgeschlagen"
fi
Ein solches Konstrukt benutzt das aufrufende Script meistens, um bei Fehlern des aufgerufenen Scripts zu reagieren, beispielsweise mit einer Userinteraktion, wie fortgefahren werden soll.
Logik Operatoren
Es gibt einen recht einfachen Mechanismus, um ein Kommando nur dann auszuführen, wenn das Kommando davor erfolgreich war. Dazu dient der Operator &&
./sub.sh && echo "erfolgreich"
Hierbei wird das echo Kommando nur dann ausgeführt, wenn sub.sh erfolgreich durchlaufen wurde.
Genau den umgekehrten Fall bildet der Operator ||
ab. Damit wird das nachfolgende Kommando nur ausgeführt, wenn das vorangestellte Kommando fehlschlägt.
./sub.sh fail || echo "Fehlschlag"
&&
benutzt du immer dann, wenn ein Kommando von der korrekten Arbeit eines anderen abhängig ist. Mit ||
kannst du ein alternatives Kommando zum fehlgeschlagenen starten, um die Situation irgendwie noch zu retten.
Fazit
Bei bash Scripten gibt es ein Paradigma: „Schreib ein Script, das eine Sache kann, die dafür aber richtig gut“. Anders ausgedrückt, statt die gesamte Funktionalität in ein einzelnes Script zu packen, ist meistens sinnvoller, für einzelne Aufgaben, eigene kleinere und übersichtlichere Scripte zu schreiben. Parameter und Exit-Codes dienen dabei als Schnittstelle zwischen den einzelnen Teilscripten.