2012-11-02 9 views
48
gedruckt wird

Wer weiß, wenn wir set +x in bash sagen kann, ohne es gedruckt wird:Bash set + x ohne es

set -x 
command 
set +x 

Spuren

+ command 
+ set +x 

aber es sollte nur drucken

+ command 

Bash ist Version 4.1.10 (4). Dies nervt mich schon seit einiger Zeit - die Ausgabe ist mit nutzlosen set +x Zeilen überladen, was die Trace-Einrichtung nicht so nützlich macht, wie sie sein könnte.

+0

, aber wenn Sie Ihren Skript laufen, warum nicht: 'script.sh 2> & 1 | grep -v 'set + x' ' – cdarke

Antwort

28

Sie können eine Unterschale verwenden. Nach Erhalt der Subshell Verlassen wird die Einstellung auf x verloren:

(set -x ; command) 
+0

Nun, danke ... guter Punkt. Tatsächlich ist mir "der Sub-Shell-Trick" bewusst. Ich hoffte, es könnte einfacher sein. Es beinhaltet wesentliche Änderungen im Code, wodurch der Code komplexer und weniger lesbar wird. IMHO das wäre schlimmer als das Leben mit dem Set + x Zeilen ... –

+0

Ich sehe nicht, wie '(set -x \ n command \ n)' ist schlimmer als 'set -x \ n command \ n set + x'. – chepner

+2

@chepner: Sie können keine Variablen festlegen. – choroba

77

ich hatte das gleiche Problem, und ich war in der Lage, eine Lösung zu finden, die keine Subshell nicht verwendet:

set -x 
command 
{ set +x; } 2>/dev/null 
+6

Große Antwort, nur eine Anmerkung: Ohne ein Semikolon nach dem Befehl wird dies nicht funktionieren; und mit einem Semikolon, aber ohne Leerzeichen zu den Klammern, wird ein Syntaxfehler ausgelöst. – sdaau

+5

Dies setzt den Exit-Status auf Null. –

+0

@GarthKidd Der Exit-Status wird mit jedem erfolgreichen Befehl auf Null gesetzt. 'set + x' ist solch ein erfolgreicher Befehl –

6

I gehackt, um eine Lösung für dieses Problem erst vor kurzem, als ich wurde ärgerlich mit ihm:

shopt -s expand_aliases 
_xtrace() { 
    case $1 in 
     on) set -x ;; 
     off) set +x ;; 
    esac 
} 
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<' 

auf diese Weise können Sie xtrace wie im folgenden, wo ich Protokollierung, wie die Argumente assign aktivieren und deaktivieren ed auf Variablen:

xtrace on 
ARG1=$1 
ARG2=$2 
xtrace off 

Und Sie Ausgabe zu erhalten, die wie folgt aussieht: Dies ist nicht die Antwort auf Ihre Frage

$ ./script.sh one two 
+ ARG1=one 
+ ARG2=two 
+0

Cleverer Trick (obwohl Sie den'/dev/stdin' Teil nicht brauchen). Der Nachteil ist, dass das Aktivieren der Alias-Erweiterung in Skripten unerwünschte Nebenwirkungen haben kann. – mklement0

+0

Sie haben Recht. Ich habe die Antwort bearbeitet, um das überflüssige '/ dev/stdin' zu entfernen. Mir sind keine spezifischen Nebenwirkungen bekannt, da die nicht interaktive Umgebung keine Dateien laden sollte, die Aliase definieren. Welche Nebenwirkungen könnte es geben? – user108471

+1

Das ist ein guter Punkt - ich habe vergessen, dass Aliase nicht vererbt werden, also ist das Risiko viel kleiner als ich dachte (hypothetisch könnte Ihr Skript Drittanbieter-Code sein, der zufällig Aliase definiert, aber ich stimme zu, dass das wahrscheinlich kein echtes ist Weltkonzern). +1 – mklement0