En bash, lors de l'exécution avec l' -x
option, est-il possible d'exempter les commandes individuelles de l'écho?
J'essaie de rendre la sortie aussi nette que possible, donc j'exécute certaines parties de mon script en sous-shell avec set +x
. Cependant, la ligne set +x
elle-même est toujours en écho et n'ajoute aucune information précieuse à la sortie.
Je me souviens du mauvais vieux .bat
temps, lors de l'exécution avec echo on
, les lignes individuelles pouvaient être exemptées en les commençant par un @
. Y a-t-il un équivalent en bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
Lors de l'exécution de ce qui précède, la sortie est:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
La raison qui
set +x
est imprimée est que celaset -x
signifie "imprimer la commande que vous êtes sur le point d'exécuter, avec des extensions, avant de l'exécuter . Donc, le shell ne sait pas que vous voulez qu'il n'imprime pas les choses tant qu'il n'a pas imprimé la ligne lui disant de ne pas pour imprimer des choses. À ma connaissance, il n'y a aucun moyen d'empêcher cela de se produire.la source
Voici la solution que vous recherchiez:
La commande d'origine s'exécute dans le même shell sous une transformation d'identité. Juste avant l'exécution, vous obtenez une trace non récursive des arguments. Cela vous permet de retracer les commandes qui vous intéressent sans spamer stederr avec des copies en double de chaque commande "echo".
la source
perl
(et problèmes avec les commandes multi-lignes):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
manœuvres m'achètent-elles quelque chose par rapport à justeprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }