Detaillierte Erklärung des Skript-Debugging-Mechanismus in Bash

Detaillierte Erklärung des Skript-Debugging-Mechanismus in Bash

Ausführen des Skripts im Debugmodus

Sie können das gesamte Skript im Debugmodus ausführen, indem Sie bash -x <script> verwenden. Bash druckt jede Befehlszeile aus, bevor sie ausgeführt wird, und jeder Zeile wird ein +-Zeichen vorangestellt, um die Anzahl der verschachtelten Ebenen des Befehls anzugeben.

> bash -x debug.sh 
+ echo 'Erste Zeile'
Erste Zeile # Die Ausgabe hat kein Pluszeichen ++ Datum # Der Befehl wird zuerst ausgeführt, um die beiden Pluszeichen zu ersetzen, da der Befehl in echo + echo ‚Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done‘ verschachtelt ist.
Druckdatum und -zeit: Do., 26. März 2020, 20:21:28 Uhr CST. Erledigt.

Bei komplexen Skripten können wir die Umgebungsvariable PS4 mit den eingebauten Variablen zum Debuggen nutzen, um detailliertere Informationen auszugeben:

> export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
> bash -x debug.sh 
+debug.sh:3:: echo 'Erste Zeile'
Erste Zeile
++debug.sh:4:: Datum
+debug.sh:4:: echo „Datum und Uhrzeit drucken: Do, 26. März 2020, 20:35:59 Uhr CST. Erledigt.“
Druckdatum und -zeit: Do., 26. März 2020, 20:35:59 Uhr CST. Erledigt.

Wir können auch das Schlüsselwort DEBUG von trap verwenden, um einen angegebenen Befehl oder eine angegebene Funktion auszuführen, bevor jede Zeile des Skripts interpretiert wird:

Falle 'echo "VARIABLE-TRACE> \$variable = \"$variable\""' DEBUG
Variable = 29
let-Variable++
lass Variable*=5
Ausfahrt 0

# Ausgabe wie folgt VARIABLE-TRACE> $variable = ""
VARIABLE-TRACE> $variable = "29"
VARIABLE-TRACE> $variable = "30"
VARIABLE-TRACE> $variable = "150"

Sie können das Schlüsselwort „trap ERR“ auch verwenden, um voreingestellte Aktionen auszuführen, wenn während der Interpretation ein Fehler auftritt, z. B. das Drucken des Fehlerbefehls:

Falle 'echo $BASH_COMMAND' ERR

Angesichts der geringen Effizienz des Debuggens mit Trap wird jedoch empfohlen, die Debugging-Option direkt in komplexeren Skripten zu verwenden oder Debugging-Tools wie bashdb zu nutzen.

Erweitertes Debuggen

Anzeigen von Funktionsaufrufinformationen

Die Verwendung des integrierten Befehlsaufrufers in einer Funktion kann die Aufrufinformationen der Funktion an stdout ausgeben. Beachten Sie jedoch, dass der Befehl innerhalb der Funktion aufgerufen werden muss.

#!/usr/bin/bash

Funktion1 () {
  für i in `seq 0 3`
  Tun
    echo -e "Level$i\t `Anrufer $i`"
  Erledigt
}

Funktion2 () {
  Funktion1
}

Funktion3 () {
  Funktion2
}

Funktion3
caller 0 # muss in einer Funktion aufgerufen werden, sonst erfolgt keine Ausgabe exit 0

Das Ausführen des Skripts führt zu folgender Ausgabe:

Level0 11 func2 call.sh # Direkter Aufrufer von func1
Level1 15 func3 call.sh # Eine Ebene indirekter Aufrufe
Level2 18 main call.sh # Indirekter Aufruf der zweiten Ebene
Level3 # Keine Ausgabe, da kein Aufruf der dritten Ebene vorhanden ist

Lokales Debuggen

Sie können einen lokalen Debugblock mit dem Set-Befehl erstellen. Sie können lokales Debugging wie folgt hinzufügen:

setze -x
Datum
setze +x
> bash script1.sh # Es müssen keine Debug-Parameter hinzugefügt werden. Das Skript startet jetzt.

+ Datum
Freitag, 28. Februar 2020, 18:23:04 Uhr CST
+Satz +x

Dies ist eine Zeichenfolge: schwarz
Und das ist eine Zahl: 9

Debug-Parametertabelle

Kurzbefehle Lange Befehle Wirkung
setze -f setze -o noglob Metazeichenübereinstimmung für Dateinamen deaktivieren
setze -v set -o ausführlich Drucken Sie den eingegebenen Befehl
setze -x setze -o xtrace Die Befehlszeile druckt am Anfang „+“ und wenn ein Fehler auftritt, werden detaillierte Informationen ausgedruckt.

Parameter, die zum Debuggen verwendet werden, können während des Betriebs dynamisch hinzugefügt oder gelöscht werden:

> setze -v
> Datum
Datum 
Freitag, 28. Februar 2020, 18:54:47 Uhr CST
> set -x # Parameter können akkumuliert werden. Die Wirkung von date # -v + die Wirkung von date # -xFri 28 Feb 2020 06:55:37 PM CST
> set +vx # Parameter set +vx abbrechen

Sie können die Anzahl der Escape-Zeichen in Ihrem Skript erheblich reduzieren, indem Sie die Option -f verwenden:

> ls?
x86_64-pc-linux-gnu-bibliothek
> set -f # Metazeichen-Übereinstimmung deaktivieren > ls?
ls: kann nicht auf '?' zugreifen: Keine solche Datei oder kein solches Verzeichnis
> berühren?
> ls?
'?'
> rm?
> set +f -x # Option x kann auch verwendet werden, um detaillierte Fehlerinformationen anzuzeigen > aaa
+aaa
+ '[' -x /usr/lib/Befehl nicht gefunden ']'
+ /usr/lib/Befehl nicht gefunden --aaa

Befehl 'aaa' nicht gefunden. Meinten Sie:

 Befehl „aha“ von deb aha (0,5-1)
 Befehl „jaaa“ von deb jaaa (0.8.4-4)
 Befehl „aa“ aus Deb Astronomical-Almanac (5.6-6)

Versuchen Sie: sudo apt install <deb name>

+ zurück 127

Standardmäßiges Debuggen

Sie können Parameter auch direkt zur ersten Zeile des Skripts hinzufügen, um das Skript standardmäßig im Debugmodus zu starten:

#!/bin/bash -xv

Sie können echo auch verwenden, um vor dem möglicherweise fehlgeschlagenen Befehl Debuginformationen auszugeben:

echo "Debug-Meldung: Jetzt wird versucht, den Befehl w zu starten"; w # Verwenden Sie ;, um die auszuführenden Befehle zu sortieren echo "Die Variable VARNAME ist jetzt auf $VARNAME eingestellt."

Festlegen von Optionen zur Unterstützung des Debuggens

Um das Debuggen zu erleichtern, können wir den Befehl „set“ verwenden, um die Bash-Optionen festzulegen:

> set -o # Den Switch-Status aller Optionen anzeigen > set -o | grep xtrace
xtrace aus
> set -x # entspricht set -o xtrace
> set -o | grep xtrace 
+ grep --color=auto xtrace
+ setze -o
xtrace auf
> set +x # entspricht set +o xtrace
+Satz +x
> set -o | grep xtrace
xtrace aus

Allgemeine Debugoptionen

Beim Verweisen auf eine definierte Variable tritt ein Fehler auf:

> $VAR aufheben; $VAR echo

> set -u # entspricht set -o nounset
> echo $var
bash: var: ungebundene Variable

Um ein versehentliches Überschreiben von Daten in Dateien zu verhindern, stellen Sie die Weiterleitung auf eine vorhandene Datei so ein, dass sie verboten ist:

> set -C # entspricht set -o noclobber
> Berührungstest
> Datum > Test
bash: Test: Vorhandene Datei kann nicht überschrieben werden

So einstellen, dass Platzhalter nicht aufgelöst werden:

> set -f # entspricht set -o noglob
> berühren *
> ll *
-rw-rw-r-- 1 remilia remilia 0 1. März 20:09 '*'

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung des Skript-Debugging-Mechanismus in Bash. Weitere relevante Inhalte zum Debuggen von Bash-Skripts finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Starten Sie mithilfe eines Batch-Skripts ein Git-Bash-Fenster in einem bestimmten Verzeichnis
  • Umgang mit Variablen mit Leerzeichen in Shell-Skripten (Bash-Skripten)
  • Mit dem Bash-Skript können Sie bei jeder Anmeldung an der Shell Linux-Systeminformationen anzeigen
  • So überwachen Sie die Linux-Speichernutzung mit einem Bash-Skript
  • Detaillierte Erklärung, wie man ein Passwort an den SSH/SCP-Befehl im Bash-Skript übergibt
  • Beispiel zur Identifizierung des Benutzers mithilfe eines Linux-Bash-Skripts
  • Detaillierte Erklärung der Unterschiede zwischen Quelle, sh, bash und ./ bei der Ausführung von Shell-Skripten
  • Überwachung von Linux-Bash-Skripts, Starten und Stoppen des Skriptschreibens für Weblogic-Dienste
  • So schreiben Sie sichere, voll funktionsfähige Bash-Skripte

<<:  Die Verwendung und Methoden von async und await in JavaScript

>>:  MySQL 8.0.18 fügt Benutzer zur Datenbank hinzu und erteilt Berechtigungen

Artikel empfehlen

Tutorial zum Erstellen eines SVN-Servers mit Docker

SVN ist die Abkürzung für Subversion, ein Open-So...

Spezifische Verwendung des MySQL-Parameters binlog_ignore_db

Vorwort: Nach dem Studium des vorherigen Artikels...

Detaillierte Erläuterung der Verwendung des DockerHub-Image-Repository

Bisher wurden die von uns verwendeten Images alle...

Eine kurze Diskussion über Makrotasks und Mikrotasks in js

Inhaltsverzeichnis 1. Über JavaScript 2. JavaScri...

Übersicht über die Zeitkonfiguration unter Linux-System

1. Zeitarten werden unterteilt in: 1. Netzwerkzei...

Ein Artikel zum Erlernen von CSS3-Bildrändern

Mit der CSS3-Eigenschaft „border-image“ können Si...

Erläuterung von JavaScript-Mikrotasks und Makrotasks

Vorwort: js ist eine Single-Thread-Sprache, daher...

Mysql löscht doppelte Daten, um die kleinste ID-Lösung beizubehalten

Suchen Sie online nach doppelten Daten und behalt...

JavaScript zur Implementierung der Webversion des Gobang-Spiels

In diesem Artikel wird der spezifische Code für J...

Detaillierte Erläuterung der Systemeingabe- und -ausgabeverwaltung in Linux

Verwaltung der Ein- und Ausgaben im System 1. Ver...