Dans un script shell, comment puis-je faire écho à toutes les commandes shell appelées et développer les noms de variables?
Par exemple, étant donné la ligne suivante:
ls $DIRNAME
J'aimerais que le script exécute la commande et affiche ce qui suit
ls /full/path/to/some/dir
Le but est de sauvegarder un journal de toutes les commandes shell appelées et de leurs arguments. Existe-t-il peut-être un meilleur moyen de générer un tel journal?
set -x
vous donnera ce que vous voulez.Voici un exemple de script shell pour démontrer:
Cela étend toutes les variables et imprime les commandes complètes avant la sortie de la commande.
Production:
la source
set -o verbose
ouset -v
(uniquement "verbeux") ouset -o xtrace
ouset -x
(uniquement "xtrace") ouset -xv
(les deux) ouset -o xtrace -o verbose
(les deux).J'utilise une fonction pour faire écho et exécuter la commande:
Quelles sorties
Pour des canaux de commandes plus compliqués, etc., vous pouvez utiliser eval:
Quelles sorties
la source
++ set +x
sortie lorsqu'il est éteint, ainsi que l'air plus propre. Cependant, pour une seule ou deux déclarations, la réponse de Bhassel à l'aide d'un sous-shell est la plus pratique.set +x
, cela affecte toutes les commandes, ce qui est trop!cp "foo bar" baz
etcp foo "bar baz"
, par exemple. C'est donc bon pour afficher les informations de progression à un utilisateur; moins pour le débogage de sortie ou l'enregistrement de commandes reproductibles. Différents cas d'utilisation. Danszsh
, vous pouvez conserver les citations avec le:q
modificateur:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
de votre commande. Alors ne vous attendez pas à ce qu'il fonctionne correctementexe eval "echo 'eval world'"
!Vous pouvez également basculer cette option pour certaines lignes de votre script en les encapsulant
set -x
etset +x
, par exemple,la source
La réponse de shuckc pour l'écho des lignes sélectionnées a quelques inconvénients: vous vous retrouvez également avec la
set +x
commande suivante en écho et vous perdez la possibilité de tester le code de sortie avec$?
car il est écrasé par leset +x
.Une autre option consiste à exécuter la commande dans un sous-shell:
ce qui vous donnera une sortie comme:
Cela entraîne cependant la surcharge de la création d'un nouveau sous-shell pour la commande.
la source
++ set +x
sortie.if [ $? -eq 0 ]
parif (set -x; COMMAND)
.Une autre option consiste à mettre "-x" en haut de votre script au lieu de sur la ligne de commande:
la source
./myScript
etbash myScript
. Encore une bonne chose à souligner, merci.Selon TLDP du Guide Bash pour les débutants: Chapitre 2. Rédaction et scripts de débogage :
la source
Tapez "bash -x" sur la ligne de commande avant le nom du script Bash. Par exemple, pour exécuter foo.sh, tapez:
la source
Vous pouvez exécuter un script Bash en mode débogage avec l'
-x
option .Cela fera écho à toutes les commandes.
Vous pouvez également enregistrer l'option -x dans le script . Spécifiez simplement l'
-x
option dans le shebang.la source
bash -vx
Pour zsh, echo
Et pour le débogage,
la source
Pour
csh
ettcsh
, vous pouvezset verbose
ouset echo
(ou vous pouvez même définir les deux, mais cela peut entraîner la duplication la plupart du temps).L'
verbose
option imprime à peu près l'expression shell exacte que vous tapez.L'
echo
option indique davantage ce qui sera exécuté par le frai.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
la source
La sortie est la suivante:
la source
Pour permettre l'écho des commandes composées, j'utilise la fonction
eval
plus Soth pourexe
faire écho et exécuter la commande. Ceci est utile pour les commandes redirigées qui, autrement, ne montreraient rien ou seulement la partie initiale de la commande redirigée.Sans eval:
Les sorties:
Avec eval:
Quelles sorties
la source