Ajout de commentaires en utilisant 'set -x'

Parfois, il est très pratique de simplement append

set -x 

en haut de votre script pour afficher toutes les commands avant qu'elles ne soient exécutées.

Il n'y a qu'un seul inconvénient à créer des scripts avec un résultat décent: Je ne sais pas comment append la sortie de text au script de cette façon. Si j'utilise

 echo 'some comment' 

il en résultera une printing doublée:

 + echo 'some comment' some comment 

Et si j'utilise # il n'est pas du tout montré.

Comment puis-je append des commentaires imprimés comme avec un echo ? Si j'utilise set -x ?

Une façon hacky est juste d'écrire vos commentaires en tant qu'arguments à une command no-op. Particulièrement utile pourrait être l' utilitaire : null :

 set -x : Some interesting notes on the following are ... 

résulte en:

 + : Some interesting notes on the following are... 

La command deux points ne fait rien, accepte les arguments que vous lui donnez, et réussit toujours. Vous obtenez un extra : au début de votre sortie de trace, mais ce n'est probablement pas un gros problème pour votre objective.

Si vous n'aimez pas le : un truc encore plus méchant est d'utiliser une command fausse:

 set -x seq 1 1 Some comment &>/dev/null true 

affichera:

 + seq 1 1 1 + Some comment + true 

C'est-à-dire que la ligne de Some comment est imprimée en tant que sortie de trace lorsque le shell tente de l'exécuter, mais le message d'erreur qui en résulte est envoyé à /dev/null . C'est méchant pour beaucoup de raisons évidentes, mais cela count aussi comme une erreur pour les buts de set -e .


Notez que, dans les deux cas, votre commentaire est analysé par le shell de manière ordinaire, donc si vous avez des caractères spéciaux, il est nécessaire de les citer et parce que c'est le résultat de la trace, le guillemet sera affiché.

Au lieu d'utiliser "set -x" pour imprimer les informations de debugging, utilisez une fonction de debugging distincte:

 #!/bin/bash DEBUG=1 debug() { if [ $DEBUG == 1 ] then echo "DEBUG:" $@ fi } debug "foo bar" 

Exécuter le script donne

 temeraire:ul jenny$ ./testdebug.sh DEBUG: foo bar 

Si vous changez l'affectation à la place lisez DEBUG=0 , il n'imprimera pas la ligne.

J'utilise set -x pour déboguer des scripts tout le time, et je n'ai jamais trouvé la solution suggérée par @MichaelHomer qui utilise l' utilitaire null (aka : ..some comment ... ).

Lorsque vous êtes prêt à passer à une solution plus puissante, je suggère de mettre en œuvre vos scripts en utilisant et enregistreur réel tels que log4Bash .

Exemple

 #!/usr/bin/env bash source log4bash.sh log "This is regular log message... log and log_info do the same thing"; log_warning "Luke ... you turned off your targeting computer"; log_info "I have you now!"; log_success "You're all clear kid, now let's blow this thing and go home."; log_error "One thing's for sure, we're all gonna be a lot thinner."; # If you have figlet installed -- you'll see some big letters on the screen! log_captains "What was in the captain's canvast?"; # If you have the "say" command (eg on a Mac) log_speak "Resistance is futile"; 

Résultats:

ss # 1