Est-ce que quelqu'un sait si nous pouvons dire set +x
en bash sans qu'il soit imprimé:
set -x
command
set +x
traces
+ command
+ set +x
mais il devrait juste imprimer
+ command
Bash est la version 4.1.10 (4). Cela me dérange depuis un certain temps maintenant - la sortie est encombrée de set +x
lignes inutiles , ce qui rend la fonction de trace pas aussi utile qu'elle pourrait l'être.
script.sh 2>&1 | grep -v 'set +x'
Réponses:
J'ai eu le même problème, et j'ai pu trouver une solution qui n'utilise pas de sous-shell:
la source
set +x
est une telle commande réussiecommand
, cette variation est une solution:{ STATUS=$?; set +x; } 2>/dev/null
. Ensuite, inspectez$STATUS
les lignes suivantes à votre guise.{ set +x; } 2>&-
. Cela ferme purement et simplement fd 2 plutôt que de le faire pointer sur / dev / null. Certains programmes ne gèrent pas très bien lorsqu'ils essaient d'imprimer sur stderr, c'est pourquoi / dev / null est un bon style en général; mais leset -x
traçage du shell le gère très bien, donc cela fonctionne parfaitement ici, et cela rend cette incantation un peu plus courte.Vous pouvez utiliser un sous-shell. À la sortie du sous-shell, le paramètre à
x
sera perdu:la source
( set -x \n command \n )
est pireset -x \n command \n set +x
.cd
: cela ne change pas le répertoire courant dans le shell parent.J'ai piraté une solution à cela tout récemment quand je suis devenu ennuyé avec cela:
Cela vous permet d'activer et de désactiver xtrace comme dans l'exemple suivant, où je consigne comment les arguments sont affectés aux variables:
Et vous obtenez une sortie qui ressemble à:
la source
/dev/stdin
pièce). La mise en garde est que l'activation de l'extension d'alias dans les scripts peut avoir des effets secondaires indésirables./dev/stdin
. Je n'ai connaissance d'aucun effet secondaire spécifique, car l'environnement non interactif ne devrait charger aucun fichier définissant des alias. Quels effets secondaires pourrait-il y avoir?set +x
est beaucoup plus difficile (sinon impossible) de faire des compromis. Mais c'est toujours une bonne et simple solution - probablement la meilleure à ce jour.Que diriez-vous d'une solution basée sur une version simplifiée de @ user108471:
la source
function () { set_plus_x='{ set +x; } 2>/dev/null' }
C'est une combinaison de quelques idées qui peuvent entourer un bloc de code et préserver l'état de sortie.
Une fois exécuté:
la source
()
tourexit
n'est pas nécessaire. D'accord. Peut-être que paranoïaque, mais si ce code est utilisé en général vous avez un bon vecteur d'attaque: Redéfinirtrace_on
ettrace_off
et le code inject qui lit les commandes exécutées. Si vous utilisez de telles "utilités" seules, c'est instructif, mais si le code est utilisé avec d'autres, vous devez vous demander si les avantages de ces fonctions non standardisées l'emportent sur les inconvénients. Personnellement, je me suis installé{ set +x; } 2>/dev/null
car cette construction est généralement comprise et ne change pas non plus le statut de sortie.