Debuggen von Bash-Skripten



Die Debug-Optionen


Zum Debuggen der Bash stehen zwei Optionen zur Verfügung:
-v gibt jede Zeile vor dem Ausführen nochmals aus.
-x schaltet den eigentlichen Debug-Modus ein. Wie bei -v auch, wird bei -x jede Zeile vor dem Ausführen nochmals angezeigt.
Im Unterschied zu -v wird allerdings exakt der Befehl ausgegeben, der auch ausgeführt wird, sprich es werden Variablen, Alias-Befehle und dergleichen mehr ersetzt.
Im folgenden Beispiel wird der Befehl cd $HOME verwendet. $HOME ist eine Environment-Variable, in welcher das Home-Verzeichnis des jeweiligen Benutzers gespeichert ist.
Ist -v eingeschaltet, gibt der Befehl folgende Zeile aus:
cd $HOME
Ist -x eingeschaltet, gibt der Befehl folgende Zeile aus:
+ cd /home/linux
Sind -v und -x eingeschaltet, wird Folgendes ausgegeben:
cd $HOME
+ cd /home/linux

Noch eine Anmerkung: Wie bei der Option -x zu sehen ist, wird am Anfang der Zeile ein + mit ausgegeben, es können aber auch mehrere + ausgegeben werden, wie z.B. ++ oder +++. Dies ist vor allem in größeren Skripten von Bedeutung, welche auch andere Skripte aufrufen. Bei Befehlen vom ersten Skript wird immer ein + verwendet. Das nächste aufgrufene Skript erhält ++ usw. Somit kann man leicher erkennen, in welchem Skript die gerade ausgeführte Zeile steht.

Anwendung der Debug-Optionen


Um die Optionen -v und -x anzuwenden gibt es zwei Möglichkeiten:
Die eine ist der Befehl set. Durch set -vx werden -v und -x eingeschaltet, durch set +vx wieder ausgeschaltet. Wird set in der Bash eingegeben, werden allerdings nur die eingegebenen Kommandos ge-debugged, Skripte nicht. Dazu muss dieser Befehl explizit im Skript angegeben werden, effektiv an erster Stelle, da erst ab diesem Befehl das Debuggen beginnt.
Eine andere Möglichkeit ist, das Skript mit folgendem Befehl aufzurufen: sh -vx <Skriptname>. Dadurch werden das Skript und teilweisse auch vom Skript aufgerufene Skripte in den Debug-Modus versetzt.

Mitprotokollieren


Um die Ausgaben in einem Logfile zu protokollieren, verwende ich folgenden Befehl:
sh -vx "Skriptname" 2>&1 | tee logfile.log .
Eine kurze Warnung am Rande: logfile.log wird überschrieben. Alle darin enthaltenen Informationen gehen verloren. Will man die Ausgabe an dem Logfile anhängen, so muss der Befehl folgendermaßen lauten:
sh -vx "Skriptname" 2>&1 | tee -a logfile.log.
Der Befehl im einzelnen: Mit sh -vx "Skriptname" wird das Skript in den Debug-Modus versetzt und ausgeführt. Die Anführungszeichen sind deshalb notwendig, damit sich der Rest des Befehles auch auf die Debug-Ausgaben bezieht und nicht nur auf die Ausgaben vom Skript selbst.
2>&1 leitet die Fehlerausgabe (2) in die Standardausgabe (1) um.
| tee [-a] logfile.log leitet nun die Standardausgabe nach tee um. tee ist ein Programm, welches in diesem Fall die Daten auf dem Monitor ausgibt und gleichzeitig in einem Logfile speichert.

Ich hoffe, Euch mit diesem kurzem Artikel ein wenig geholfen zu haben. Ich muss dazu sagen, dass dieser Artikel fast ausschließlich auf eigenen Erfahrungen beruht. Somit bin ich für Ergänzungen, Fehler und Kommentare jederzeit offen. Zögert nicht damit ;-)

(c) 2003 by String Val, www.linux-related.de
Dieses Dokument unterliegt der GNU Free Documentation License