2012-11-02 1 views
48

Est-ce que quelqu'un sait si on peut dire set +x en bash sans qu'il soit imprimé:Bash jeu + x sans qu'il soit imprimé

set -x 
command 
set +x 

traces

+ command 
+ set +x 

mais il devrait simplement imprimer

+ command 

Bash est la version 4.1.10 (4). Cela m'embête depuis un certain temps - la sortie est encombrée de lignes inutiles set +x, rendant la fonction de trace pas aussi utile qu'elle pourrait l'être.

+0

Cela ne répond pas à votre question, mais lorsque vous exécutez votre script pourquoi ne pas: 'script.sh 2> & 1 | grep -v 'set + x' ' – cdarke

Répondre

28

Vous pouvez utiliser un sous-shell. A la sortie du sous-shell, le paramètre x sera perdu:

(set -x ; command) 
+0

Eh bien, merci ... bon point. En fait, je suis conscient de "l'astuce sous-shell." J'espérais que ça pourrait être plus facile que ça. Cela implique des changements substantiels dans le code, ce qui rend le code plus complexe et moins lisible. À mon humble avis cela serait pire que de vivre avec l'ensemble + x lignes ... –

+0

Je ne vois pas comment '(set -x \ n commande \ n)' est pire que 'set -x \ n commande \ n set + x'. – chepner

+2

@chepner: Vous ne pouvez pas définir de variables. – choroba

77

J'ai eu le même problème, et j'ai pu trouver une solution qui n'utilise un sous-shell:

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

Grande réponse, juste une note: sans un point-virgule après la commande cela ne fonctionnera pas; et avec un point-virgule mais sans espaces pour les accolades, une erreur de syntaxe sera soulevée. – sdaau

+5

Ceci met le statut de sortie à zéro. –

+0

@GarthKidd L'état de sortie est remis à zéro à chaque commande réussie. 'set + x' est une commande tellement réussie –

6

I piraté une solution à ce tout récemment, quand je suis devenu ennuyé avec elle:

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

cela vous permet d'activer et de désactiver xtrace comme dans ce qui suit, où je Logging comment les arguments sont assign ed variables:

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

Et vous obtenez une sortie qui ressemble à:

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

Astuce astucieuse (bien que vous n'ayez pas besoin de la partie'/dev/stdin'). La mise en garde est que l'activation de l'expansion d'alias dans les scripts peut avoir des effets secondaires indésirables. – mklement0

+0

Vous avez raison. J'ai édité la réponse pour enlever le '/ dev/stdin' superflu. Je ne suis pas au courant d'effets secondaires spécifiques, car l'environnement non interactif ne doit pas charger les fichiers qui définissent les alias. Quels effets secondaires pourrait-il y avoir? – user108471

+1

C'est un bon point - j'ai oublié que les alias ne sont pas hérités, donc le risque est beaucoup plus petit que ce que je pensais (hypothétiquement, votre script pourrait trouver du code tiers qui définit des alias, mais je suis d'accord préoccupation mondiale). +1 – mklement0