Ist es in bash -x
möglich, einzelne Befehle vom Echo auszunehmen, wenn sie mit der Option ausgeführt werden?
Ich versuche, die Ausgabe so ordentlich wie möglich zu gestalten, daher führe ich bestimmte Teile meines Skripts in einer Subshell mit aus set +x
. Die Zeile set +x
selbst wird jedoch weiterhin wiederholt und fügt der Ausgabe keine wertvollen Informationen hinzu.
Ich erinnere mich, dass in den schlechten alten .bat
Zeiten, als ich mit lief echo on
, einzelne Zeilen ausgenommen werden konnten, indem man sie mit a begann @
. Gibt es ein Äquivalent in Bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
Wenn Sie das oben genannte ausführen, lautet die Ausgabe:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
Der Grund, der
set +x
gedruckt wird,set -x
bedeutet: "Drucken Sie den Befehl, den Sie ausführen möchten , mit Erweiterungen aus, bevor Sie ihn ausführen . Die Shell weiß also nicht, dass sie keine Dinge drucken soll, bis sie die Zeile gedruckt hat, in der dies nicht angegeben ist." Dinge zu drucken. Nach meinem besten Wissen gibt es keine Möglichkeit, dies zu verhindern.quelle
Hier ist die Lösung, nach der Sie gesucht haben:
Der ursprüngliche Befehl wird in derselben Shell unter einer Identitätstransformation ausgeführt. Kurz vor dem Ausführen erhalten Sie eine nicht rekursive xtrace der Argumente. Auf diese Weise können Sie die Befehle, die Ihnen wichtig sind, verfolgen, ohne stederr mit doppelten Kopien jedes "echo" -Befehls zu spammen.
quelle
perl
(und Probleme mit mehrzeiligen Befehlen):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
Kaufen mir die Manöver etwas im Vergleich zu nurprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }