Que fait `set -x`?

261

J'ai un script shell avec la ligne suivante:

[ "$DEBUG" == 'true' ] && set -x
Ole
la source
15
Jetez un oeil:help -m set | less
Cyrus
4
Merci pour l' help -m setastuce. Ça marche. J'ai essayé man setavant de demander, mais sur ubuntu il y aNo manual entry for set
Ole
2
@Ole, setest intégré à bash, donc si vous le man bashtrouvez dans la section SHELL BUILTIN COMMANDS. Lorsque vous affichez la page de manuel , vous pouvez probablement sauter en recherchant cette expression rationnelle: \bset \[.
User5910

Réponses:

365

set -xactive un mode du shell où toutes les commandes exécutées sont imprimées sur le terminal. Dans votre cas, il est clairement utilisé pour le débogage, ce qui est un cas d'utilisation typique pour set -x: l'impression de chaque commande lors de son exécution peut vous aider à visualiser le flux de contrôle du script s'il ne fonctionne pas comme prévu.

set +x le désactive.

John Zwinck
la source
5
Comment désactiver à nouveau cette fonctionnalité?
feedc0de
85
@DanielBrunner: le set +xdésactive.
John Zwinck
2
C'est TRÈS utile! J'aimerais que quelqu'un me l'ait dit plus tôt. Y a-t-il d'autres astuces intéressantes comme celle-ci qui peuvent en quelque sorte stimuler notre méta-compétence sur les scripts?
Étudiant
7
@Student: set -een haut de votre script, le script se termine avec une erreur chaque fois qu'une erreur se produit (et n'est pas explicitement gérée). Je trouve cela immensément préférable à la valeur par défaut, qui est de continuer à faire bon gré mal gré (comme l'infâme de Visual Basic On Error Resume Next).
John Zwinck
1
@JohnZwinck, malheureusement, set -ea des effets secondaires très indésirables, au point qu'il rend la révision du code presque impossible (car le comportement d'une ligne donnée dépend de ce qui se passe dans la pile des appels - si une fonction est appelée dans un contexte "vérifié", elle set -eest désactivée pour cette invocation et tout ce qu'elle appelle à son tour). Voir les exercices dans BashFAQ # 105 .
Charles Duffy
78

set -x

Imprime une trace de commandes simples, pour les commandes, les commandes de casse, les commandes de sélection et l'arithmétique pour les commandes et leurs arguments ou les listes de mots associées après leur développement et avant leur exécution. La valeur de la variable PS4 est développée et la valeur résultante est imprimée avant la commande et ses arguments développés.

[ source ]

Exemple

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

L'exemple ci-dessus illustre l'utilisation de set -x. Lorsqu'il est utilisé, l'expression arithmétique ci-dessus a été développée. Nous pourrions voir comment une ligne simple a été évaluée étape par étape.

  • La première étape expra été évaluée.
  • La deuxième étape echoa été évaluée.

Pour en savoir plus sur le set → visitez ce lien

en ce qui concerne votre script shell,

[ "$DEBUG" == 'true' ] && set -x

Votre script peut avoir imprimé des lignes d'informations supplémentaires lorsque le mode d'exécution a été sélectionné comme DEBUG. Traditionnellement, les gens activaient le mode de débogage lorsqu'un script appelé avec un argument facultatif tel que-d

Raju
la source
6

-u: désactivé par défaut. Lorsqu'il est activé, un message d'erreur s'affiche lors de l'utilisation d'une variable non configurée.

-v: inactif par défaut. Après l'activation, le contenu original des informations sera affiché (sans résolution variable) avant la sortie des informations.

-x: inactif par défaut. S'il est activé, le contenu de la commande sera affiché avant l'exécution de la commande (après la résolution variable, il y a un symbole ++).

Comparez les différences suivantes:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
lupguo
la source