2012-11-02 18 views
48

Qualcuno sa se si può dire set +x in bash senza essere stampato:Bash set + x senza che sia stampato

set -x 
command 
set +x 

tracce

+ command 
+ set +x 

ma deve solo stampare

+ command 

Bash è la versione 4.1.10 (4). Questo mi disturba da un po 'di tempo - l'output è ingombro di inutili linee set +x, rendendo la funzione di traccia non così utile come potrebbe essere.

+0

Ciò non rispondere alla tua domanda, ma quando si esegue lo script perché non: 'script.sh 2> & 1 | grep -v 'set + x' ' – cdarke

risposta

28

È possibile utilizzare una subshell. Uscendo dalla subshell, l'impostazione x verrà perso:

(set -x ; command) 
+0

Bene, grazie ... buon punto. In realtà sono a conoscenza del "trucco sub-shell". Speravo che potesse essere più facile di così. Implica cambiamenti sostanziali nel codice, rendendo il codice più complesso e meno leggibile. IMHO sarebbe peggio che vivere con il set + x linee ... –

+0

Non vedo come '(set -x \ n comando \ n)' è peggio di 'set -x \ n comando \ n set + x'. – chepner

+2

@chepner: non è possibile impostare variabili. – choroba

77

Ho avuto lo stesso problema, e sono stato in grado di trovare una soluzione che non fa uso di una subshell:

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

Ottima risposta, solo una nota: senza un punto e virgola dopo il comando questo non funzionerà; e con un punto e virgola ma senza spazi per le parentesi, verrà generato un errore di sintassi. – sdaau

+5

Questo azzera lo stato di uscita. –

+0

@GarthKidd Lo stato di uscita viene azzerato con ogni comando eseguito correttamente. 'set + x' è un comando di successo –

6

I hacked una soluzione a questo solo di recente, quando sono diventato irritato con esso:

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

questo ti permette di abilitare e disabilitare xtrace come nell'esempio seguente, dove sto accedendo come gli argomenti sono assegnare ed alle variabili:

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

E si ottiene in uscita che assomiglia:

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

Trucchetto intelligente (sebbene non sia necessario la parte'/dev/stdin'). L'avvertenza è che l'attivazione dell'alias alias negli script può avere effetti collaterali indesiderati. – mklement0

+0

Hai ragione. Ho modificato la risposta per rimuovere il superfluo '/ dev/stdin'. Non sono a conoscenza di effetti collaterali specifici, poiché l'ambiente non interattivo non dovrebbe caricare alcun file che definisce alias. Quali effetti collaterali potrebbero esserci? – user108471

+1

Questo è un buon punto - ho dimenticato che gli alias non sono ereditati, quindi il rischio è molto più piccolo di quanto pensassi (ipoteticamente, il tuo script potrebbe essere il codice di terze parti che capita di definire alias, ma sono d'accordo che probabilmente non è un vero -comprensione mondiale). +1 – mklement0

Problemi correlati