Wie kann man ein Bash-Skript debuggen?

31

Gibt es eine Möglichkeit, Bash-Skripte zu debuggen, ohne Echo und Protokollierung zu verwenden?

Ich spreche über die Verwendung von Haltepunkten und dergleichen.

UAdapter
quelle

Antworten:

20

Es gibt verschiedene Möglichkeiten, dh:

  • Führen Sie Ihr Skript mit der Option -x aus

    bash -x yourscript.sh
  • Fügen Sie set -xam Anfang Ihrer Skriptdatei nach dem Shebang #!/bin/bashund vor dem Beginn Ihres Skripts eine neue Zeile hinzu , set -vum die Shell-Eingabezeilen und set -xdie ausgeführten Befehle und Argumente anzuzeigen

  • Ersetzen Sie das Wort Ihrer Skriptdatei durch #!/bin/bash -xv

NES
quelle
4

Mit dieser kleinen Funktion können Sie in "console" wechseln:

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Dann in Ihrem Skript (BEISPIEL):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Es akzeptiert jeden Befehl, wobei die lokalen Variablen intakt bleiben. Um den "Debug" -Modus zu verlassen, geben Sie "exit" ein (das Skript wird nicht beendet) und der Code wird fortgesetzt. Wenn Sie "debug" innerhalb einer Schleife verwenden, wird diese jedes Mal angehalten. Sie können es in ein "wenn" einschließen (wie im obigen Beispiel) oder eine "watch" -Funktion erstellen:

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

Ich habe auch den Befehl "vars" hinzugefügt, mit dem alle verfügbaren Variablen und ihre Werte ausgegeben werden. Sie können auch Ihre eigenen benutzerdefinierten Befehle hinzufügen.

Ich habe den Code in wenigen Minuten erstellt, verwenden Sie ihn also auf eigenes Risiko. Beachten Sie, dass im Debug-Modus jeder Befehl ausgeführt werden kann. Dies stellt ein Sicherheitsrisiko dar, wenn Sie ihn in einem Produktionsskript belassen.

Lepe
quelle
3
Vermeiden Sie die Verwendung von Variablennamen in Großbuchstaben. Ihr Risiko überschreibt spezielle Shell-Variablen und Umgebungsvariablen. Stellen Sie außerdem sicher, dass Sie Parametererweiterungen in Anführungszeichen setzen, wenn diese als Argumente verwendet werden, um Wortteilung und Pfadnamenerweiterung im Ergebnis zu vermeiden. zB * ) eval "$cmd" ;;und debug_watch "$file" strange_case.txt.
Geirha
Bearbeiteter Code wie von geirha vorgeschlagen.
15.
2

Zur Verdeutlichung dessen, was NES sagt, gibt es in bash gesetzte Flags, die das Debuggen ermöglichen.

Das set -xFlag kann entweder im Terminal oder in Ihrem Skript gesetzt und wieder entfernt werden. Verwenden von +oder -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Die setBefehle bewirken Folgendes:

  • set -f Deaktivieren Sie die Dateinamengenerierung mit Metazeichen.
  • set -v Druckt (ausführliche) Shell-Eingabezeilen, während sie gelesen werden.
  • set -x Befehlsspuren drucken, bevor der Befehl ausgeführt wird.

sethat eigentlich viele funktionen, aber leider keine manpage, da es sich um ein in die shell eingebautes tool handelt. Das Handbuch zu set befindet sich in der GNU Bash-Dokumentation .

Es gibt zahlreiche Befehlszeilentools, mit denen Sie Details zu Ihrem Programm abrufen können, z.

  • stat Datei- oder Dateisystemstatus anzeigen
  • file Bestimmen Sie einen Dateityp.
  • hexdump Filter, der die angegebenen Dateien in verschiedenen Formaten anzeigt
  • nohup Führen Sie ein Skript aus, das nicht hängt

    und zahlreiche andere. Ich habe versucht, an den Befehl zu denken, der verborgene Zeichen anzeigt, aber ich kann es jetzt nicht tun. Hexdump wird es schaffen, aber es gibt einen besseren.

Der Befehl key ctrl\bewirkt, dass ein laufendes Programm oder Skript einen Core-Dump ausführt. Dann könnten Sie den Kernspeicherauszug analysieren. Ich würde wahrscheinlich gdb verwenden, um einen Coredump zu analysieren, aber dafür gibt es viele Programme.

Die Bash-Shell bietet auch einige nützliche Debugging-Optionen. Optionen --debugger, -vausführliche --dump-stringsund andere raffinierte Optionen, die Sie unterstützen. Überprüfen Sie sie mit man bash.

Der trapBefehl (Shell eingebaut) könnte für Sie sehr hilfreich sein. trap sagt, wenn Ihr Programm unerwartet beendet wird, führen Sie etwas aus. Sie lesen über Falle und andere praktische Bash Shell builtins hier .

Im Moment ist das Debuggen ein großes Thema in jeder Sprache. Einige andere Themen, die für das Debuggen in einer beliebigen Programmiersprache nützlich sein können, sind Shell-Umleitung und Signalverarbeitung.

Schließlich ist mir klar, dass das Beispiel, das ich verwendet habe, trivial ist, aber dass einige Shell-Skripte Hunderte von Zeilen umfassen können. In solchen Situationen möchte ich entweder Kommentartags einfügen und vermuten, dass der Code fehlerhaft ist, oder alternativ einen Exit-Befehl einfügen und versuchen, den Funktionscode mithilfe einer Divide-and-Conquer-Technik vom fehlerhaften Code zu isolieren.

j0h
quelle
1

Eine GUI-Option zum Debuggen eines Bash-Skripts ist die Eclipse-IDE mit den BashEclipse / Shelled-Plug-ins.

Hier finden Sie die Funktionen Ihrer Frage ( breakpoints and stuff) sowie eine Vielzahl weiterer Funktionen zum Debuggen komplexer Bash-Skripte.

Einige der Funktionen umfassen:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Haltepunkt umschalten
  • Einzelschritt für Schritt
  • Step-In-, Step-Out-, Step-Over-Funktionen und Unterprogramme
  • Überprüfen von Codevariablen zu jedem Zeitpunkt, zu dem das Skript ausgeführt wird
  • TODO-Aufgabenliste
  • Lesezeichenliste
  • Mehrere Fenster bearbeiten
  • Remote Sharing der Projektumgebung

Die Perspektive des Skripteditors: Eclipse Script IDE

Die Debugging-Perspektive: Debug-Perspektive für Eclipse-Skripte

Die Schritte für die Verwendung sind das Hinzufügen der Shelledund BashEclipse-Pluggins zu Eclipse. Führen Sie dann die in der BashEclipse-Readme-Textdatei bereitgestellte Prozedur aus, um den Debugger zu starten.

LD James
quelle