Weiß jemand, ob wir set +x
in Bash sagen können, ohne dass es gedruckt wird:
set -x
command
set +x
Spuren
+ command
+ set +x
aber es sollte nur drucken
+ command
Bash ist Version 4.1.10 (4). Das nervt mich schon seit einiger Zeit - die Ausgabe ist voll mit nutzlosen set +x
Zeilen, was die Trace-Funktion nicht so nützlich macht, wie sie sein könnte.
script.sh 2>&1 | grep -v 'set +x'
Antworten:
Ich hatte das gleiche Problem und konnte eine Lösung finden, die keine Unterschale verwendet:
quelle
set +x
ist so ein erfolgreicher Befehlcommand
, ist diese Variante eine Lösung :{ STATUS=$?; set +x; } 2>/dev/null
. Dann überprüfen Sie$STATUS
in nachfolgenden Zeilen nach Belieben.{ set +x; } 2>&-
. Damit wird fd 2 sofort geschlossen, anstatt auf / dev / null zu zeigen. Einige Programme funktionieren nicht so gut, wenn sie versuchen, auf stderr zu drucken, weshalb / dev / null im Allgemeinen ein guter Stil ist. Aber dieset -x
Verfolgung der Shell handhabt es ganz gut, so dass es hier perfekt funktioniert, und es macht diese Beschwörung ein bisschen kürzer.Sie können eine Unterschale verwenden. Beim Verlassen der Unterschale geht die Einstellung auf
x
verloren:quelle
( set -x \n command \n )
schlimmer ist alsset -x \n command \n set +x
.cd
: Es ändert nicht das aktuelle Verzeichnis in der übergeordneten Shell.Ich habe erst kürzlich eine Lösung dafür gefunden, als ich mich darüber geärgert habe:
Auf diese Weise können Sie xtrace wie im Folgenden aktivieren und deaktivieren, wobei ich protokolliere, wie die Argumente Variablen zugewiesen werden:
Und Sie erhalten eine Ausgabe, die wie folgt aussieht:
quelle
/dev/stdin
Teil nicht brauchen ). Die Einschränkung besteht darin, dass das Aktivieren der Alias-Erweiterung in Skripten unerwünschte Nebenwirkungen haben kann./dev/stdin
. Mir sind keine spezifischen Nebenwirkungen bekannt, da die nicht interaktive Umgebung keine Dateien laden sollte, die Aliase definieren. Welche Nebenwirkungen könnten auftreten?set +x
Es ist viel schwieriger (wenn nicht unmöglich), Kompromisse einzugehen. Aber es ist immer noch eine gute und klare Lösung - wahrscheinlich die bisher beste.Wie wäre es mit einer Lösung, die auf einer vereinfachten Version von @ user108471 basiert:
quelle
function () { set_plus_x='{ set +x; } 2>/dev/null' }
Dies ist eine Kombination einiger Ideen, die einen Codeblock einschließen und den Exit-Status beibehalten können.
Bei Ausführung:
quelle