it-swarm.com.de

Wie kann man ein Bash-Skript debuggen?

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

Ich spreche über die Verwendung von Haltepunkten und dergleichen.

31
UAdapter
18
danizmax

Es gibt verschiedene Möglichkeiten, d.h .:

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

    bash -x yourscript.sh
    
  • Fügen Sie set -x in eine neue Zeile am Anfang Ihrer Skriptdatei nach dem Shebang #!/bin/bash ein, und vor dem Beginn Ihres Skripts zeigt set -v die Shell-Eingabezeilen an, set -x die ausgeführten Befehle und Argumente

  • ersetzen Sie den Shebang Ihrer Skriptdatei durch #!/bin/bash -xv

20
NES

Heutzutage gibt es die Visual Studio Code Bash Debug-Erweiterung . Es hat 'Step in/out/over' und kann den Wert jeder Variablen anzeigen.

VS Code Bash Debug screenshot

shellcheck ist das beste in der Stadt -

http://www.shellcheck.net/

sie können auch mit vim integrieren, hier ist das Git Repo -

https://github.com/koalaman/shellcheck

6
ramgorur

Mit dieser kleinen Funktion können Sie in die "Konsole" 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.

3
lepe

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

Das set -x -Flag kann entweder im Terminal oder in Ihrem Skript gesetzt und wieder entfernt werden. Mit + 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 Befehle set bewirken Folgendes:

  • set -f Deaktivieren Sie die Dateinamengenerierung mit Metazeichen.
  • set -v Druckt (ausführlich) Shell-Eingabezeilen, während sie gelesen werden.
  • set -x Druckbefehlsspuren vor Ausführung des Befehls.

set hat tatsächlich viele Funktionen, aber leider keine Manpage, da es sich um ein in 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 erhalten können, z.

  • stat Zeigt den Status der Datei oder des Dateisystems an
  • 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 Tastaturbefehl ctrl\ führt dazu, 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 raffinierte Debugging-Optionen. Optionen --debugger, -v ausführlich, --dump-strings und andere raffinierte Optionen, die Sie unterstützen. Probieren Sie sie mit man bash aus.

Der Befehl trap (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 Trap und andere nützliche Bash Shell-Funktionen 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.

2
j0h

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

Hier finden Sie die Funktionen Ihrer Frage (breakpoints and stuff) sowie eine Reihe 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
  • Untersuchen von Codevariablen zu jedem Zeitpunkt, zu dem das Skript ausgeführt wird
  • TODO-Aufgabenliste
  • Lesezeichenliste
  • Mehrere Fenster bearbeiten
  • Remote Sharing der Projektumgebung

Die Script Editor Perspektive: Eclipse Script IDE

Die Debugging-Perspektive: Eclipse Script Debug Perspective

Die Schritte für die Verwendung bestehen darin, die Plug-Ins Shelled und BashEclipse zu Eclipse hinzuzufügen. Führen Sie dann die in der BashEclipse-Readme-Textdatei bereitgestellte Prozedur aus, um den Debugger zu starten.

1
L. D. James