
Ich debugge einen Aufrufstapel und gebe einfach echo
Anweisungen aus verschiedenen Dateien aus. Flache Protokolle sind etwas schwierig zu verfolgen, daher bin ich neugierig, wie man Ausgaben am besten verschachtelt.
Ich dachte, dass das Festlegen einer Umgebungsvariable entweder auf die Anzahl der Tabulatoren oder als Präfix-Leerzeichen/Tabulatorzeichenfolge die einfachste Option sein könnte, wenn ich den STDOUT-Stream überladen könnte. Im Grunde wäre es schön, wenn ich etwas tun könnte, um STDOUT="$TABS$STDOUT"
Tabulatorzeichen am Anfang des Ausgabestreams zu stapeln.
Aber ich war mir nicht sicher, ob es überhaupt möglich ist, den Stream zu überschreiben? Wenn ich beispielsweise jeder Zeile ein Bindestrich+Leerzeichen voranstellen möchte, ist das möglich?
So dass:
echo foo
echo bar
echo foobar
Produziert:
- foo
- bar
- foobar
- Ist die Erstellung von STDOUT-Templates möglich?
- Welche Methode wird zum Verschachteln von Ausgaben empfohlen, ohne alle
echo
/printf
-Anweisungen in den vielen verschiedenen möglicherweise aufgerufenen Skripts ändern zu müssen?
Antwort1
Wenn Sie nichts dagegen haben, stdout und stderr zusammenzuführen, ist es wahrscheinlich am einfachsten, mit dem -x
Flag zu arbeiten, das bash veranlasst, jeden Befehl bei der Ausführung mit einem Präfix wie dem auszugeben, +++
bei dem die Anzahl der Zeichen von der Verschachtelungsebene abhängt. Sie können die Ausgabe dann nachbearbeiten, indem Sie sich das Präfix merken, aber die Zeile unterdrücken und es auf jede folgende Zeile ohne Präfix anwenden, die Ihr Echo oder Printf sein wird.
Nehmen Sie zum Beispiel ein kleines Fakultätsskript myprog
:
#!/bin/bash
f(){
local i=$1
if [[ "$i" > 1 ]]
then echo $((i*$(f $((i-1)))))
else echo $i
fi
echo "my debug info $i" >&2
}
echo "factorial ${1?} is $(f $1)"
Ausführen mit
bash -x myprog 4 |&
awk '/^+/{ indent=$1; next }
{ print indent " " $0 }'
gibt Ihnen
+++++ my debug info 1
++++ my debug info 2
+++ my debug info 3
++ my debug info 4
+ factorial 4 is 24
Natürlich können Sie recht gute Debug-Ausgaben mit Zeilennummern, Dateinamen und Funktionen erhalten, indem Sie einfach PS4
mit setzen -x
. Beispiel:
PS4='+ ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]} - [${SHLVL},${BASH_SUBSHELL}, $?] '
gibt Ihnen:
++ myprog:10: main - [2,1, 0] f 4
++ myprog:3: f - [2,1, 0] local i=4
++ myprog:4: f - [2,1, 0] [[ 4 > 1 ]]
+++ myprog:5: f - [2,2, 0] f 3
+++ myprog:3: f - [2,2, 0] local i=3
+++ myprog:4: f - [2,2, 0] [[ 3 > 1 ]]
++++ myprog:5: f - [2,3, 0] f 2
++++ myprog:3: f - [2,3, 0] local i=2
++++ myprog:4: f - [2,3, 0] [[ 2 > 1 ]]
...