Bash-bedingte Umleitung beim Testen / Debuggen

2

Was ist die beste Möglichkeit, eine Umleitung in Bash zu Test- und Debugging-Zwecken unter bestimmten Bedingungen durchzuführen?

In meinen Skripten füge ich eine Debug-Option hinzu, um zu zeigen, was bei einem Testlauf ohne Verarbeitung tatsächlich passiert wäre. Wenn die Debug-Option aktiviert ist, soll die DEBUG-Option eine Skriptzeile mit Umleitung wiedergeben, die die Umleitung effektiv wiedergibt und das Echo nicht umleitet . Ein Beispiel würde dies wahrscheinlich besser erklären:

In einem Skript, das einen mysqldump mit den ihm übergebenen args ausführt, möchte ich, dass die debug-Option den mysqldump-Befehl so anzeigt, wie er ohne die Option -d ausgeführt worden wäre.

[ "-d" = "$1" ] && DEBUG=echo
$DEBUG mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > $dbase.sql.dump

Wenn ich also DEBUG als "echo" ausgeben möchte, möchte ich NICHT zu "$ dbase.sql.dump" zurückkehren. Eigentlich möchte ich die Variablen ">" und "$ dbase" mit ".sql.dump" ausgeben "text. Wenn die Debug-Option nicht aktiviert ist, möchte ich den Befehl so ausführen, wie er ist.

Die set -xund set -v-Optionen sind hier nicht wirklich die Antwort, da das Debuggen wirklich nur eine Testausgabe- / Probelaufoption ist, die der Benutzer sehen kann und das Skript nicht wirklich debuggt, um Codierungsprobleme zu beheben.

johnnyB
quelle

Antworten:

2

Das Problem wird sein, alles richtig zu entkommen. Warum versuchst du nicht einen etwas anderen Ansatz:

CMD='mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > "$dbase.sql.dump"';
[ "-d" = "$1" ] && echo $CMD
eval $CMD

Der Trick besteht darin, den Befehl als Variable zu speichern und die Variable dann nur dann zu drucken, wenn Sie debuggen. Dadurch entfällt das zweimalige Ausschreiben, und Sie können evaldie Variable zum Ausführen des darin enthaltenen Befehls verwenden.

terdon
quelle
Ich wollte wirklich keine andere Zeile, die ausgeführt wurde; Das heißt, die Debug-Zeile ist dieselbe Zeile wie die nicht debuggte Zeile. Außerdem wird Code ziemlich hässlich, wenn jede Zeile drei Zeilen enthält: eine zum Einstellen der CMD, zum Überprüfen von Debug und Echo und die letzte zum Auswerten der CMD
johnnyB
@johnnyB Ich persönlich packe so etwas in eine Funktion und rufe einfach auf. run_or_echo($CMD)Es ist die Funktion, die prüft -dund entscheidet, ob sie wiedergegeben oder ausgeführt werden soll. Das ist tatsächlich eine Zeile weniger pro Befehl als in Ihrem ursprünglichen Skript. Wie auch immer, ich bin mir ziemlich sicher, dass Sie es nicht so machen können, wie Sie es wollen, da das >zum Ausführen des Befehls verwendet werden muss und es ausgeblendet werden muss, wenn Sie es wiedergeben und Sie das Ganze nicht in Anführungszeichen setzen können, weil Bash Won Ich kann es nicht als Befehl erkennen. Ich sehe keinen Weg daran vorbei, >ist ein bashSonderzeichen und dein Drehbuch wird von interpretiert bash.
Terdon
Ich sehe keine
Umgehung