Bash/Debugging: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
== Debugging für das gesamte Skript ==
== Debugging für das gesamte Skript ==
Wenn die Dinge nicht nach Plan laufen, müssen Sie herausfinden, was genau die Ursache für das Scheitern des Skripts istDie Bash bietet umfangreiche Debugging-FunktionenDie gebräuchlichste ist, die Subshell mit der Option <code>-x</code> zu starten, wodurch das gesamte Skript im Debug-Modus ausgeführt wirdDie Spuren der einzelnen Befehle und ihrer Argumente werden auf der Standardausgabe ausgegeben, nachdem die Befehle expandiert wurden, aber bevor sie ausgeführt werden.
Wenn die Dinge nicht nach Plan laufen, müssen Sie herausfinden, was genau die Ursache für das Scheitern des Skripts ist
* Die Bash bietet umfangreiche Debugging-Funktionen
* Die gebräuchlichste ist, die Subshell mit der Option <code>-x</code> zu starten, wodurch das gesamte Skript im Debug-Modus ausgeführt wird
* Die Spuren der einzelnen Befehle und ihrer Argumente werden auf der Standardausgabe ausgegeben, nachdem die Befehle expandiert wurden, aber bevor sie ausgeführt werden


Dies ist das <code>kommentierte-script1.sh</code> Skript, das im Debug-Modus ausgeführt wirdBeachten Sie auch hier, dass die hinzugefügten Kommentare in der Ausgabe des Skripts nicht sichtbar sind.
Dies ist das <code>kommentierte-script1.sh</code> Skript, das im Debug-Modus ausgeführt wird
* Beachten Sie auch hier, dass die hinzugefügten Kommentare in der Ausgabe des Skripts nicht sichtbar sind
{| class="wikitable"
{| class="wikitable"
|
|
|}
|}
Es gibt jetzt einen vollwertigen Debugger für die Bash, der bei SourceForge verfügbar istDiese Debugging-Funktionen sind in den meisten modernen Versionen der Bash ab 3.x verfügbar.
Es gibt jetzt einen vollwertigen Debugger für die Bash, der bei SourceForge verfügbar ist
* Diese Debugging-Funktionen sind in den meisten modernen Versionen der Bash ab 3.x verfügbar


== Debugging für Teile des Skripts ==
== Debugging für Teile des Skripts ==
Mit dem '''set''' der Bash können Sie die Teile des Skripts, von denen Sie sicher sind, dass sie fehlerfrei sind, im normalen Modus ausführen und nur für problematische Bereiche Debugging-Informationen anzeigenAngenommen, wir sind uns nicht sicher, was der '''w'''-Befehl im Beispiel <code>kommentiertes-skript1.sh</code> bewirken wird, dann könnten wir ihn wie folgt in das Skript einschließen:
Mit dem '''set''' der Bash können Sie die Teile des Skripts, von denen Sie sicher sind, dass sie fehlerfrei sind, im normalen Modus ausführen und nur für problematische Bereiche Debugging-Informationen anzeigen
* Angenommen, wir sind uns nicht sicher, was der '''w'''-Befehl im Beispiel <code>kommentiertes-skript1.sh</code> bewirken wird, dann könnten wir ihn wie folgt in das Skript einschließen:
{| class="wikitable"
{| class="wikitable"
|
|
Zeile 17: Zeile 23:
|
|
|}
|}
Sie können den Debugging-Modus innerhalb desselben Skripts beliebig oft ein- und ausschalten.
Sie können den Debugging-Modus innerhalb desselben Skripts beliebig oft ein- und ausschalten


Die folgende Tabelle gibt einen Überblick über weitere nützliche Bash-Optionen:
Die folgende Tabelle gibt einen Überblick über weitere nützliche Bash-Optionen:
Zeile 29: Zeile 35:
|set -f
|set -f
|set -o noglob
|set -o noglob
|Deaktiviert die Generierung von Dateinamen mit Metazeichen (Globbing).
|Deaktiviert die Generierung von Dateinamen mit Metazeichen (Globbing)
|-
|-
|set -v
|set -v
|set -o verbose
|set -o verbose
|Druckt Shell-Eingabezeilen aus, wenn sie gelesen werden.
|Druckt Shell-Eingabezeilen aus, wenn sie gelesen werden
|-
|-
|set -x
|set -x
|set -o xtrace
|set -o xtrace
|Druckt Befehlsspuren vor der Ausführung des Befehls.
|Druckt Befehlsspuren vor der Ausführung des Befehls
|}
|}
Der Bindestrich wird verwendet, um eine Shell-Option zu aktivieren und ein Plus, um sie zu deaktivierenLassen Sie sich davon nicht verwirren!
Der Bindestrich wird verwendet, um eine Shell-Option zu aktivieren und ein Plus, um sie zu deaktivieren
* Lassen Sie sich davon nicht verwirren!


Im folgenden Beispiel werden diese Optionen in der Befehlszeile demonstriert:
Im folgenden Beispiel werden diese Optionen in der Befehlszeile demonstriert:
Zeile 45: Zeile 52:
|
|
|}
|}
Alternativ können diese Modi auch im Skript selbst angegeben werden, indem die gewünschten Optionen in der ersten Zeile der Shell-Deklaration hinzugefügt werdenOptionen können kombiniert werden, wie es bei UNIX-Befehlen üblich ist:
Alternativ können diese Modi auch im Skript selbst angegeben werden, indem die gewünschten Optionen in der ersten Zeile der Shell-Deklaration hinzugefügt werden
* Optionen können kombiniert werden, wie es bei UNIX-Befehlen üblich ist:


'''#!/bin/bash <code>-xv</code>'''
'''#!/bin/bash <code>-xv</code>'''


Wenn Sie den fehlerhaften Teil Ihres Skripts gefunden haben, können Sie '''echo'''-Anweisungen vor jedem Befehl einfügen, bei dem Sie unsicher sind, so dass Sie genau sehen, wo und warum etwas nicht funktioniertIm Beispielskript <code>commented-script1.sh</code> könnte man das so machen, wobei man immer noch davon ausgeht, dass die Anzeige der Benutzer Probleme macht:
Wenn Sie den fehlerhaften Teil Ihres Skripts gefunden haben, können Sie '''echo'''-Anweisungen vor jedem Befehl einfügen, bei dem Sie unsicher sind, so dass Sie genau sehen, wo und warum etwas nicht funktioniert
* Im Beispielskript <code>commented-script1.sh</code> könnte man das so machen, wobei man immer noch davon ausgeht, dass die Anzeige der Benutzer Probleme macht:
{| class="wikitable"
{| class="wikitable"
|
|

Version vom 1. März 2024, 20:49 Uhr

Debugging für das gesamte Skript

Wenn die Dinge nicht nach Plan laufen, müssen Sie herausfinden, was genau die Ursache für das Scheitern des Skripts ist

  • Die Bash bietet umfangreiche Debugging-Funktionen
  • Die gebräuchlichste ist, die Subshell mit der Option -x zu starten, wodurch das gesamte Skript im Debug-Modus ausgeführt wird
  • Die Spuren der einzelnen Befehle und ihrer Argumente werden auf der Standardausgabe ausgegeben, nachdem die Befehle expandiert wurden, aber bevor sie ausgeführt werden

Dies ist das kommentierte-script1.sh Skript, das im Debug-Modus ausgeführt wird

  • Beachten Sie auch hier, dass die hinzugefügten Kommentare in der Ausgabe des Skripts nicht sichtbar sind

Es gibt jetzt einen vollwertigen Debugger für die Bash, der bei SourceForge verfügbar ist

  • Diese Debugging-Funktionen sind in den meisten modernen Versionen der Bash ab 3.x verfügbar

Debugging für Teile des Skripts

Mit dem set der Bash können Sie die Teile des Skripts, von denen Sie sicher sind, dass sie fehlerfrei sind, im normalen Modus ausführen und nur für problematische Bereiche Debugging-Informationen anzeigen

  • Angenommen, wir sind uns nicht sicher, was der w-Befehl im Beispiel kommentiertes-skript1.sh bewirken wird, dann könnten wir ihn wie folgt in das Skript einschließen:

Die Ausgabe sieht dann wie folgt aus:

Sie können den Debugging-Modus innerhalb desselben Skripts beliebig oft ein- und ausschalten

Die folgende Tabelle gibt einen Überblick über weitere nützliche Bash-Optionen:

Tabelle 2-1. Übersicht der eingestellten Debugging-Optionen

Kurze Schreibweise Lange Schreibweise Ergebnis
set -f set -o noglob Deaktiviert die Generierung von Dateinamen mit Metazeichen (Globbing)
set -v set -o verbose Druckt Shell-Eingabezeilen aus, wenn sie gelesen werden
set -x set -o xtrace Druckt Befehlsspuren vor der Ausführung des Befehls

Der Bindestrich wird verwendet, um eine Shell-Option zu aktivieren und ein Plus, um sie zu deaktivieren

  • Lassen Sie sich davon nicht verwirren!

Im folgenden Beispiel werden diese Optionen in der Befehlszeile demonstriert:

Alternativ können diese Modi auch im Skript selbst angegeben werden, indem die gewünschten Optionen in der ersten Zeile der Shell-Deklaration hinzugefügt werden

  • Optionen können kombiniert werden, wie es bei UNIX-Befehlen üblich ist:

#!/bin/bash -xv

Wenn Sie den fehlerhaften Teil Ihres Skripts gefunden haben, können Sie echo-Anweisungen vor jedem Befehl einfügen, bei dem Sie unsicher sind, so dass Sie genau sehen, wo und warum etwas nicht funktioniert

  • Im Beispielskript commented-script1.sh könnte man das so machen, wobei man immer noch davon ausgeht, dass die Anzeige der Benutzer Probleme macht:

In fortgeschritteneren Skripten kann das echo eingefügt werden, um den Inhalt von Variablen in verschiedenen Phasen des Skripts anzuzeigen, so dass Fehler aufgedeckt werden können: