Wie kann man ein Bash-Shell-Skript unter Linux oder UNIX debuggen?
Aus meinem Mailbag:
Ich habe ein kleines Hallo-Welt-Skript geschrieben. Wie kann ich ein Bash-Shell-Skript auf einem Linux- oder Unix-ähnlichen System debuggen?
Dies ist die häufigste Frage, die von neuen Sysadmins oder Linux/UNIX-Benutzern gestellt wird. Das Debuggen von Shell-Skripten kann eine mühsame Arbeit sein (also nicht einfach). Es gibt verschiedene Möglichkeiten, ein Shell-Skript zu debuggen.
Sie müssen das Argument -x oder -v an die Bash-Shell übergeben, um durch jede Zeile im Skript zu gehen.
Lassen Sie uns sehen, wie man ein Bash-Skript unter Linux und Unix mit verschiedenen Methoden debuggt.
-x Option zum Debuggen eines Bash-Shell-Skripts
Ein Shell-Skript mit der Option -x ausführen.$ bash -x script-name
$ bash -x domains.sh
Verwendung des eingebauten Befehls set
Die Bash-Shell bietet Debugging-Optionen, die mit dem Befehl set ein- oder ausgeschaltet werden können:
- set -x : Zeigt Befehle und ihre Argumente an, während sie ausgeführt werden.
- set -v : Zeigt Shell-Eingabezeilen an, wenn sie gelesen werden.
Die beiden obigen Befehle können im Shell-Skript selbst verwendet werden:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Sie können die Standard-Shebang-Zeile ersetzen:#!/bin/bash
durch den folgenden (für das Debugging) Code:#!/bin/bash -xv
Verwendung der intelligenten DEBUG-Funktion
Erst fügen Sie eine spezielle Variable namens _DEBUG hinzu. Setzen Sie _DEBUG auf ‚on‘, wenn Sie ein Skript debuggen müssen:_DEBUG="on"
Fügen Sie die folgende Funktion am Anfang des Skripts ein:
function DEBUG(){ && $@}
Nun, wo immer Sie Debugging benötigen, verwenden Sie einfach die DEBUG-Funktion wie folgt:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Wenn Sie mit dem Debuggen fertig sind (und bevor Sie Ihr Skript in die Produktion überführen), setzen Sie _DEBUG auf ‚off‘. Es ist nicht nötig, Debug-Zeilen zu löschen._DEBUG="off" # set to anything but not to 'on'
Beispielskript:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
Speichern und schließen Sie die Datei. Führen Sie das Skript wie folgt aus:$ ./script.sh
Ausgabe:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Schalten Sie nun DEBUG aus (Sie müssen die Datei bearbeiten):_DEBUG="off"
Skript ausführen:$ ./script.sh
Ausgabe:
Found in xyz.txt file2 + 3 = 5
Das ist eine einfache, aber sehr effektive Technik. Sie können auch versuchen, DEBUG als Alias anstelle von function zu verwenden.
Debugging Common Bash Shell Scripting Errors
Bash oder sh oder ksh gibt verschiedene Fehlermeldungen auf dem Bildschirm aus und in vielen Fällen kann die Fehlermeldung keine detaillierten Informationen liefern.
Die Ausführungserlaubnis für die Datei wurde nicht erteilt
Wenn Sie Ihr erstes Hallo-Welt-Bash-Shell-Skript schreiben, kann es sein, dass Sie eine Fehlermeldung erhalten, die wie folgt lautet:bash: ./hello.sh: Permission denied
Setzen Sie die Erlaubnis mit dem chmod-Befehl:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Unerwartetes Dateiende
Wenn Sie eine unerwartete Fehlermeldung erhalten, öffnen Sie Ihre Skriptdatei und stellen Sie sicher, dass sie sowohl öffnende als auch schließende Anführungszeichen enthält. In diesem Beispiel hat die echo-Anweisung ein öffnendes, aber kein schließendes Anführungszeichen:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Überprüfen Sie auch, ob Klammern und geschweifte Klammern ({}) fehlen:
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Fehlende Schlüsselwörter wie fi, esac, ;;, etc.
Wenn Sie endende Schlüsselwörter wie fi oder ;; vergessen haben, erhalten Sie eine Fehlermeldung wie „xxx unexpected“. Stellen Sie also sicher, dass alle verschachtelten if- und case-Anweisungen mit den richtigen Schlüsselwörtern enden. Siehe bash man page für Syntaxanforderungen. In diesem Beispiel fehlt fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Shell-Skript auf Windows- oder Unix-Rechnern verschieben oder bearbeiten
Erstellen Sie das Skript nicht auf Linux/Unix und verschieben Sie es nicht nach Windows. Ein weiteres Problem ist die Bearbeitung des Bash-Shell-Skripts unter Windows 10 und das Verschieben/Hochladen auf einen Unix-Server. Dies führt zu einer Fehlermeldung wie Befehl nicht gefunden aufgrund des Zeilenumbruchs (DOS CR-LF). Sie können DOS Zeilenumbrüche CR-LF in das Unix/Linux-Format konvertieren, indem Sie die folgende Syntax verwenden:dos2unix my-script.sh
Tipp 1 – Debug-Meldung an stderr senden
Standardfehler ist das Standard-Fehlerausgabegerät, das zum Schreiben aller Systemfehlermeldungen verwendet wird. Es ist also eine gute Idee, Nachrichten an das Standardfehlergerät zu senden:
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
Tipp 2 – Schalten Sie die Syntaxhervorhebung ein, wenn Sie den Texteditor vim verwenden
Die meisten modernen Texteditoren erlauben es Ihnen, die Option der Syntaxhervorhebung zu setzen. Dies ist nützlich, um die Syntax zu erkennen und häufige Fehler wie öffnende oder schließende Anführungszeichen zu vermeiden. Sie können Bash-Skripte in verschiedenen Farben sehen. Diese Funktion erleichtert das Schreiben von Shell-Skripten, und Syntaxfehler sind visuell deutlich erkennbar. Die Hervorhebung hat keinen Einfluss auf die Bedeutung des Textes selbst; sie ist nur für Sie gemacht. In diesem Beispiel wird die Syntaxhervorhebung von Vim für mein Bash-Skript verwendet:
Abbildung 01: Syntaxhervorhebung eines Bash-Shell-Skripts mit dem Texteditor Vim
Tipp 3 – Benutzen Sie Shellcheck, um das Skript zu überprüfen
ShellCheck ist ein statisches Analysewerkzeug für Shell-Skripte. Man kann es benutzen, um Fehler in seinen Shell-Skripten zu finden. Es ist in Haskell geschrieben. Sie können mit diesem Tool Warnungen und Vorschläge für Bash/Sh-Shell-Skripte finden. Sehen wir uns an, wie man ShellCheck auf einem Linux- oder Unix-ähnlichen System installiert und verwendet, um seine Shell-Skripte zu verbessern, Fehler zu vermeiden und die Produktivität zu steigern.
Siehe auch:
- Siehe, wie man die Syntaxhervorhebung unter dem Texteditor vim einschaltet.
- Bash man page
- BASH mit Debugger und verbesserter Debug-Unterstützung und Fehlerbehandlung
🐧 24 Kommentare bis jetzt… einen hinzufügen ↓
Kategorie | Liste der Unix und Linux Befehle |
---|---|
Datei Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Netzwerkdienstprogramme | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Paketmanager | apk – apt |
Prozessverwaltung | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
Suchen | grep – whereis – which |
Benutzerinformationen | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |