So debuggen Sie Bash -Skripte

So debuggen Sie Bash -Skripte

Es gibt Techniken aus herkömmlichen Programmierumgebungen, die helfen können.
Einige grundlegende Tools wie die Verwendung eines Editors mit Syntax -Hervorhebung hilft ebenfalls helfen.
Es gibt integrierte Optionen, die Bash bietet, um Debugging und Ihre alltägliche Linux -Systemverwaltungsjob zu erleichtern.

In diesem Artikel erfahren Sie einige nützliche Methoden zum Debuggen von Bash -Skripten:

  • So verwenden Sie Traditonaltechniken
  • So verwenden Sie die Xtrace -Option
  • So verwenden Sie andere Bash -Optionen
  • So verwenden Sie Trap

Das effektivste Debugging -Tool ist immer noch vorsichtig, gepaart mit mit Bedacht platzierten Druckerklärungen. - Brian Kernighan, „Unix for Anfängern“ (1979)

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Jede GNU/Linux -Verteilung
Software Gnu Bash
Andere N / A
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können

Mit herkömmlichen Techniken

Debugging -Code kann schwierig sein, auch wenn die Fehler einfach und offensichtlich sind. Programmierer haben traditionell Tools wie Debuggers und Syntax -Hervorhebungen in den Redakteuren genutzt, um sie zu unterstützen. Es ist nicht anders beim Schreiben von Bash -Skripten. Wenn Sie einfach die Syntax-Hervorhebung haben.

Einige Programmiersprachen sind mit Begleitdebugging -Umgebungen wie GCC und GDB ausgestattet, mit denen Sie Code durchlaufen, Haltepunkte festlegen, den Zustand von allem an diesen Punkten in der Ausführung und mehr untersuchen können - aber im Allgemeinen sind weniger ein solcher heftiger Ansatz erforderlich Shell -Skripte Da der Code einfach interpretiert wird, anstatt in Binärdateien zusammengestellt zu werden.

In herkömmlichen Programmierumgebungen werden Techniken verwendet, die mit komplexen Bash -Skripten nützlich sein können, z. B. die Verwendung von Behauptungen. Dies sind im Grunde genommen eine Möglichkeit, die Bedingungen oder den Zustand der Dinge zu einem Zeitpunkt explizit zu gründen. Behauptungen können auch die Untersternen von Fehler genau bestimmen. Sie können als kurze Funktion implementiert werden, die das Timing, die Zeilennummer und dergleichen oder dergleichen zeigt:

$ echo "function_name (): Wert von \\ $ var ist $ var"

So verwenden Sie die Bash Xtrace -Option

Beim Schreiben von Shell -Skripten ist die Programmierlogik tendenziell kürzer und ist häufig in einer einzelnen Datei enthalten. Es gibt also einige integrierte Debugging-Optionen, mit denen wir sehen können, was schief geht. Die erste Option zu erwähnen ist wahrscheinlich auch die nützlichste - die Xtrace Möglichkeit. Dies kann auf ein Skript angewendet werden, indem Sie Bash mit dem aufrufen -X schalten.

$ bash -x 


Dies sagt Bash, wir sollen uns zeigen, wie jede Aussage nach der Bewertung aussieht, kurz bevor sie ausgeführt wird. Wir werden in Kürze ein Beispiel dafür in Aktion sehen, aber zuerst kontrastieren wir uns kontrastieren -X mit seinem Gegenteil -v, Dies zeigt jede Zeile, bevor sie bewertet wird, anstatt danach. Optionen können kombiniert werden und durch Verwendung beider -X Und -v Sie können sehen, wie Aussagen vor und nach variablen Substitutionen aussehen.

Einstellung X Und v Optionen in der Befehlszeile

Beachten Sie, wie verwendet -X Und -v Mit Optionen zusammen können wir das Original -If -Anweisung vor dem sehen $ Benutzer Die Variable wird dank der erweitert -v Möglichkeit. Wir sehen auch in der Linie, beginnend mit einem Plus -Zeichen, wie die Aussage nach der Substitution wieder aussieht, was uns die tatsächlichen Werte zeigt Wenn Stellungnahme. In komplizierteren Beispielen kann dies sehr nützlich sein.

So verwenden Sie andere Bash -Optionen

Die Bash -Optionen für das Debuggen werden standardmäßig ausgeschaltet, aber sobald sie mit dem SET -Befehl eingeschaltet werden, bleiben sie eingeschaltet, bis sie ausdrücklich ausgeschaltet werden. Wenn Sie nicht sicher sind, welche Optionen aktiviert sind, können Sie die untersuchen $- Variable, um den aktuellen Zustand aller Variablen zu sehen.

$ echo $- Himbhs $ set -xv && echo $- HimVxbhs 

Es gibt einen weiteren nützlichen Switch, mit dem wir uns helfen können, Variablen zu finden, auf die referenziert wird, ohne dass Wertschöpfung festgelegt ist. Dies ist das -u wechseln und genau wie -X Und -v Es kann auch in der Befehlszeile verwendet werden, wie wir im folgenden Beispiel sehen:

Einstellung u Option in der Befehlszeile

Wir haben fälschlicherweise einen Wert von 7 der Variablen mit dem Namen "Level" zugewiesen und versuchten und versuchten, eine Variable mit dem Namen "Score" zu wiederholen, die einfach überhaupt nichts auf dem Bildschirm druckte. Es wurden absolut keine Debug -Informationen gegeben. Setzen Sie unsere -u Mit Switch können wir eine bestimmte Fehlermeldung „Punktzahl: Ungebundene Variable“ sehen, die genau angibt, was schief gelaufen ist.

Wir können diese Optionen in kurzen Bash -Skripten verwenden, um uns Debug -Informationen zu geben, um Probleme zu identifizieren, die sonst kein Feedback vom Bash -Dolmetscher auslösen. Gehen wir durch ein paar Beispiele.

#!/bin/bash read -p "Pfad hinzugefügt werden:" $ path if ["$ path" = "/home/mike/bin"]; dann echo $ path >> $ path echo "neu 
Kopieren Verwendung X Option beim Ausführen Ihres Bash -Skripts

Im obigen Beispiel führen wir das AddPath -Skript normal aus, und es ändert unsere einfach nicht WEG. Es gibt uns keinen Hinweis darauf, warum oder Hinweise auf Fehler gemacht wurden. Mit dem wieder ausführen -X Die Option zeigt uns deutlich, dass die linke Seite unseres Vergleichs eine leere Zeichenfolge ist. $ path ist eine leere Zeichenfolge, weil wir versehentlich ein Dollar -Schild vor „Pfad“ in unsere Read -Erklärung gestellt haben. Manchmal schauen wir einen solchen Fehler genau und es sieht nicht falsch aus, bis wir einen Hinweis bekommen und denken: „Warum ist es $ path bewertet auf eine leere Zeichenfolge?”

Wenn wir uns im nächsten Beispiel ansehen, erhalten wir auch keinen Hinweis auf einen Fehler vom Interpreter. Wir erhalten nur einen Wert pro Zeile anstelle von zwei gedruckt. Dies ist kein Fehler, der die Ausführung des Skripts einstellt. Daher werden wir uns einfach wundern, ohne Hinweise zu erhalten. Verwendung der -u Switch erhalten wir sofort eine Benachrichtigung darüber, dass unsere Variable J ist nicht an einen Wert gebunden. Dies sind also Echtzeitsparer, wenn wir Fehler machen, die nicht zu tatsächlichen Fehlern aus der Sicht des Bash -Interpreters führen.

#!/bin/bash für i in 1 2 3 do echo $ i $ j fertig 
Kopieren Verwendung u Option, die Ihr Skript aus der Befehlszeile ausführen

Jetzt denken Sie sicher, dass das gut klingt, aber wir brauchen selten Hilfe bei der Debuggierung von Fehlern, die in Einzeilern in der Befehlszeile oder in kurzen Skripten wie diesen gemacht wurden. Wir haben normalerweise Probleme mit dem Debuggen, wenn wir uns mit längeren und komplizierteren Skripten befassen, und wir müssen diese Optionen selten festlegen und sie festlegen, während wir mehrere Skripte ausführen. Einstellung -xv Optionen und anschließend ein komplexeres Skript führt häufig zu Verwirrung durch Verdoppelung oder Verdrucken der generierten Ausgabe.

Glücklicherweise können wir diese Optionen genauer nutzen, indem wir sie in unsere Skripte platzieren. Anstatt explizit eine Bash -Shell mit einer Option aus der Befehlszeile aufzurufen, können wir eine Option festlegen, indem wir sie stattdessen zur Shebang -Zeile hinzufügen.

#!/bin/bash -x

Dadurch wird die festgelegt -X Option für die gesamte Datei oder bis sie während der Skriptausführung nicht festgelegt ist, sodass Sie einfach das Skript ausführen können, indem Sie den Dateinamen eingeben, anstatt es als Parameter zu verabschieden. Ein langes Skript oder eines, das viel Ausgabe hat, wird jedoch mit dieser Technik immer noch unhandlich.



Um einen gezielteren Ansatz zu erhalten, umgeben Sie nur die verdächtigen Codeblöcke mit den gewünschten Optionen. Dieser Ansatz eignet sich hervorragend für Skripte, die Menüs oder detaillierte Ausgaben generieren, und wird durch die Verwendung des Set -Keywords mit Plus oder Minus noch einmal erreicht.

#!/bin/bash read -p "Pfad hinzugefügt werden:" $ path set -xv if ["$ path" = "/home/mike/bin"]; dann echo $ path >> $ path echo "neu 
Kopieren Wickeln Sie Optionen um einen Codeblock in Ihrem Skript um

Wir haben nur die Codeblöcke umgeben, die wir vermuten, um die Ausgabe zu reduzieren, und erleichterte unsere Aufgabe dabei. Beachten Sie, dass wir unsere Optionen nur für den Codeblock einschalten, der unsere Anweisung für IF-Then-Else enthält, und dann die Optionen (n) am Ende des verdächtigen Blocks ausschalten. Wir können diese Optionen in einem einzigen Skript mehrmals ein-. Es ist nicht erforderlich, eine Option auszuschalten, wenn wir möchten, dass sie für den Rest der Skriptausführung fortgesetzt wird.

Um die Vollständigkeit zu willen, sollten wir auch erwähnen, dass es Debugger gibt, die von Dritten verfasst wurden, die es uns ermöglichen, die Code -Ausführungszeile für Zeile durchzuführen. Vielleicht möchten Sie diese Tools untersuchen, aber die meisten Menschen stellen fest, dass sie nicht tatsächlich benötigt werden.

Wie erfahrene Programmierer vermuten lassen, ist das eigentliche Problem, dass der Code wieder überarbeitet werden sollte, wenn Ihr Code zu komplex ist, um verdächtige Blöcke zu isolieren. Übermäßig komplexer Code bedeutet, dass Fehler schwer zu erkennen sein können und die Wartung zeitaufwändig und kostspielig sein kann.

Eine letzte Sache, die Sie in Bezug auf Bash -Debugging -Optionen erwähnen können -F. Wenn Sie diese Option festlegen. Das -F Option kann ein Switch sein, der in der Befehlszeile mit Bash verwendet wird, nach dem Shebang in einer Datei oder, wie in diesem Beispiel, um einen Codeblock zu umgeben.

#!/bin/bash echo "ignorore FileGlobbing Option ausgeschaltet" ls * echo "ignorieren Sie die Option" Dateikugel "Set" set -f ls * set +f 
Kopieren Verwendung F Option zum Ausschalten der Dateikugel

So verwenden Sie Trap, um das Debuggen zu unterstützen

Es gibt mehr Techniken, die es wert sind, zu prüfen, ob Ihre Skripte kompliziert sind, einschließlich der Verwendung einer Assert -Funktion, wie bereits erwähnt. Eine solche Methode, die Sie beachten sollten, ist die Verwendung von Falle. Shell -Skripte ermöglichen es uns, Signale zu fangen und zu diesem Zeitpunkt etwas zu tun.

Ein einfaches, aber nützliches Beispiel, das Sie in Ihren Bash -Skripten verwenden können AUSFAHRT.

#!/Bin/Bash Trap 'Echo Score ist $ Score, Status $ Status' Exit if [-z $ 1]; dann status = "default" else status = $ 1 fi Score = 0 if [$ user = 'Superman']; dann Score = 99 ELIF [$# -GT 1]; dann Score = $ 2 fi 
Kopieren Mit Trap AUSFAHRT Um Ihr Drehbuch zu debuggen

Wie Sie sehen können, kann es nützlich sein, die aktuellen Werte von Variablen auf den Bildschirm zu werfen, um anzuzeigen, wo Ihre Logik fehlschlägt. Der AUSFAHRT Signal braucht offensichtlich keine explizite Ausfahrt Erklärung zu generieren; in diesem Fall die Echo Die Anweisung wird ausgeführt, wenn das Ende des Skripts erreicht ist.

Eine weitere nützliche Falle, die Sie mit Bash -Skripten verwenden sollten, ist DEBUGGEN. Dies geschieht nach jeder Aussage, sodass es als brutale Kraft verwendet werden kann, um die Werte von Variablen bei jedem Schritt in der Skriptausführung anzuzeigen.

#!/bin/bash tap 'echo "Zeile $ lineno: Score ist $ Score"' Debug -Score = 0 if ["$ user" = "mike"]; Dann sei "Score += 1" fi lass "Punktzahl += 1" if ["$ 1" = "7"]; dann Punktzahl = 7 fi Beenden 0 
Kopieren Mit Trap DEBUGGEN Um Ihr Drehbuch zu debuggen

Abschluss

Wenn Sie bemerken, dass Ihr Bash -Skript sich nicht wie erwartet verhält, und Ihnen aus irgendeinem Grund nicht klar ist. Die Xtrace -Option -X ist einfach zu bedienen und wahrscheinlich die nützlichste der hier vorgestellten Optionen. Überlegen Sie sich also, es das nächste Mal auszuprobieren, wenn Sie mit einem Skript konfrontiert sind, das nicht das tut.

Verwandte Linux -Tutorials:

  • Wie man ein Signal an Kinderprozesse aus einer Bash verbreitet…
  • Mastering -Bash -Skriptschleifen beherrschen
  • Wie man Verwaltungsoperationen mit Ansible durchführt…
  • Verschachtelte Schleifen in Bash -Skripten
  • So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu installieren auf Ubuntu 20.04
  • So verwenden Sie ADB Android Debugg Bridge, um Ihr Android zu verwalten…
  • Bash if Aussagen: if, elif, sonst, dann, fi
  • Linux -Leistungsoptimierung: Tools und Techniken