Linux-Workshop
Shell Scripting - Tipps und Tricks für Admins
Housekeeping
Mittels "trap" können wir in unserem Skript auf Signale, wie "Abbruch durch Benutzer CTRL-C" reagieren. Für ein "sauberes" Beenden und Löschen von temporär angelegten Dateien bietet die bash die Signalnummer 0, das heißt Skript-Beendigung.
Nehmen wir exemplarisch das nachfolgende Skript, welches eine Liste aller Dateien in /bin in ein temporäres File generiert und aus dieser Liste nur die erste Datei nach "/tmp/<name>.bak" kopiert. Bei normaler oder signalbedingter Beendigung wird sowohl die Liste, als auch die kopierte Datei wieder gelöscht und somit der wünschenswerte Status-Quo vor der Skriptausführung wieder hergestellt. Bei fehlerfreier Ausführung erhalten Sie als Exit-Wert 0. Sollte das Skript durch ein Signal beendet worden sein, so wird der Exit-Wert um 128 inkrementiert.
#!/bin/bash TMP=$(mktemp) TMPLIST="" clean() { /bin/rm -f $TMP $TMPLIST && echo "$TMP $TMPLIST removed" } trap 'clean; echo exit reached.' 0 ### MAIN echo "TMP file created as $TMP .." find /bin -type f > $TMP while read line; do mybase=$(basename $line).bak cp $line /tmp/$mybase && { echo "cp $line to /tmp/$mybase"; TMPLIST=/tmp/$mybase; } break done < $TMP echo "our pid is $$" sleep 10 # exit value from last commands.. |
Fehlerfreie Ausführung:
> clean.sh; echo $? clean.sh TMP file created as /home/thomas/tmp/tmp.fbu0DfjtX7 .. cp /bin/setfont to /tmp/setfont.bak our pid is 21883 /home/thomas/tmp/tmp.fbu0DfjtX7 /tmp/setfont.bak removed exit reached. 0 |
Senden wir ein "kill <pid>" an das Skript, so zeigt der Exit-Wert 128+15=143 an:
.. exit reached. Terminated <= Hinweis auf Signal 15 (TERM) 143 |
So implementierte Shell-Skripts hinterlassen keine unnötigen Dateileichen im Dateisystem.