Ich habe ein Testskript, das viele Befehle enthält und viele Ausgaben generiert. Ich verwende set -x
oder set -v
und set -e
, sodass das Skript angehalten wird, wenn ein Fehler auftritt. Es ist jedoch immer noch ziemlich schwierig für mich zu finden, in welcher Zeile die Ausführung gestoppt wurde, um das Problem zu lokalisieren. Gibt es eine Methode, die die Zeilennummer des Skripts ausgeben kann, bevor jede Zeile ausgeführt wird? Oder geben Sie die Zeilennummer vor der von set -x
? Oder jede Methode, die sich mit meinem Problem mit der Position der Skriptzeile befassen kann, wäre eine große Hilfe. Vielen Dank.
89
echo
echo
Aussagen werden am besten vermieden.-x
sollte Zeilennummern drucken. Oder vielleicht -nx
sollte Zeilennummern enthalten. Für mich ist es einer dieser "WTF"\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
für einige Farben$LINENO
Enthält in Bash die Zeilennummer, in der das Skript gerade ausgeführt wird.Wenn Sie die Zeilennummer kennen müssen, unter der die Funktion aufgerufen wurde, versuchen Sie es
$BASH_LINENO
. Beachten Sie, dass diese Variable ein Array ist.Zum Beispiel:
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
Sehen Sie hier für weitere Details der Bash Variablen.
quelle
Einfache (aber leistungsstarke) Lösung: Platzieren Sie
echo
den Code, von dem Sie glauben, dass er das Problem verursacht, und verschieben Sieecho
ihn zeilenweise, bis die Meldungen nicht mehr auf dem Bildschirm angezeigt werden - da das Skript aufgrund eines vorherigen Fehlers gestoppt wurde.Noch leistungsfähigere Lösung: Installieren Sie
bashdb
den Bash-Debugger und debuggen Sie das Skript Zeile für Zeilequelle
echo
Das Herumspielen von Dingen kann in vielen Fällen hilfreich sein, ist jedoch unzureichend, wenn Sie versuchen, es in Funktionen anzuwenden, die eine aussagekräftige, analysierbare Ausgabe haben.echo "foo" >&2
Problemumgehung für Muscheln ohne LINENO
In einem ziemlich ausgefeilten Skript möchte ich nicht alle Zeilennummern sehen. Vielmehr möchte ich die Kontrolle über die Ausgabe haben.
Definieren Sie eine Funktion
echo_line_no () { grep -n "$1" $0 | sed "s/echo_line_no//" # grep the line(s) containing input $1 with line numbers # replace the function name with nothing } # echo_line_no
Verwenden Sie es mit Anführungszeichen wie
echo_line_no "this is a simple comment with a line number"
Ausgabe ist
16 "this is a simple comment with a line number"
wenn die Nummer dieser Zeile in der Quelldatei 16 ist.
Dies beantwortet im Wesentlichen die Frage, wie die Zeilennummer angezeigt wird, wenn ein Bash-Skript für Benutzer von Asche oder anderen Shells ohne ausgeführt wird
LINENO
.Möchten Sie noch etwas hinzufügen?
Sicher. Warum brauchst du das? Wie arbeitest du damit? Was können Sie damit machen? Ist dieser einfache Ansatz wirklich ausreichend oder nützlich? Warum willst du überhaupt daran basteln?
Möchten Sie mehr wissen? Lesen Sie die Überlegungen zum Debuggen
quelle