Gibt es eine Möglichkeit, Bash-Skripte zu debuggen, ohne Echo und Protokollierung zu verwenden?
Ich spreche über die Verwendung von Haltepunkten und dergleichen.
Ja, es gibt ein Bash-Debugger-Projekt .
Sie können auch set -x
und set -v
bei der Ausführung verwenden. Mehr Info:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
Viel Glück!
Es gibt verschiedene Möglichkeiten, dh:
Führen Sie Ihr Skript mit der Option -x aus
bash -x yourscript.sh
Fügen Sie set -x
am Anfang Ihrer Skriptdatei nach dem Shebang #!/bin/bash
und vor dem Beginn Ihres Skripts eine neue Zeile hinzu , set -v
um die Shell-Eingabezeilen und set -x
die ausgeführten Befehle und Argumente anzuzeigen
Ersetzen Sie das Wort Ihrer Skriptdatei durch #!/bin/bash -xv
Heutzutage gibt es die Visual Studio Code Bash Debug-Erweiterung . Es hat 'Step in / out / over' und kann den Wert jeder Variablen anzeigen.
Shellcheck ist das beste in der Stadt -
Sie können auch mit vim integrieren, hier ist das Git-Repo -
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.
* ) eval "$cmd" ;;
unddebug_watch "$file" strange_case.txt
.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. Verwenden von+
oder-
:Die
set
Befehle 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.set
hat 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 anzeigenfile
Bestimmen Sie einen Dateityp.hexdump
Filter, der die angegebenen Dateien in verschiedenen Formaten anzeigtnohup
Führen Sie ein Skript aus, das nicht hängtund 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
,-v
ausführliche--dump-strings
und andere raffinierte Optionen, die Sie unterstützen. Überprüfen Sie sie mitman bash
.Der
trap
Befehl (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.
quelle
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 )
Die Perspektive des Skripteditors:
Die Debugging-Perspektive:
Die Schritte für die Verwendung sind das Hinzufügen der
Shelled
undBashEclipse
-Pluggins zu Eclipse. Führen Sie dann die in der BashEclipse-Readme-Textdatei bereitgestellte Prozedur aus, um den Debugger zu starten.quelle