119 votes

Bash set +x sans qu'il soit imprimé

Quelqu'un sait-il si on peut dire set +x dans 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 d'informations inutiles. set +x ce qui fait que la fonction de traçage n'est pas aussi utile qu'elle pourrait l'être.

181voto

McJoey Points 171

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

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

55voto

choroba Points 56333

Vous pouvez utiliser un sous-shell. Lorsque vous quittez le sous-shell, le paramètre à x sera perdue :

( set -x ; command )

9voto

Schollii Points 8020

Que diriez-vous d'une solution basée sur une version simplifiée de @user108471 :

shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ set +x; } 2>/dev/null'

trace_on
...stuff...
trace_off

8voto

user108471 Points 154

J'ai trouvé une solution à ce problème récemment, lorsque j'en ai eu assez :

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 l'exemple suivant, où je consigne la façon dont les arguments sont assignés aux variables :

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

Et vous obtenez une sortie qui ressemble à :

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

2voto

user3286792 Points 55

Il s'agit d'une combinaison de quelques idées permettant d'enfermer un bloc de code et de préserver l'état de sortie.

#!/bin/bash
shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ PREV_STATUS=$? ; set +x; } 2>/dev/null; (exit $PREV_STATUS)'

trace_on
echo hello
trace_off
echo "status: $?"

trace_on
(exit 56)
trace_off
echo "status: $?"

Lorsqu'il est exécuté :

$ ./test.sh 
+ echo hello
hello
status: 0
+ exit 56
status: 56

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X