Avec bash
4.1 et supérieur, vous pouvez faire
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(fonctionne également lorsque bash
est invoqué en tant que sh
).
Fondamentalement, nous disons bash
de sortir la xtrace
sortie sur le descripteur de fichier 7 au lieu de la valeur par défaut de 2, et de rediriger ce descripteur de fichier vers /dev/null
. Le nombre fd est arbitraire. Utilisez un fd supérieur à 2 qui n'est pas utilisé autrement dans votre script. Si le shell dans lequel vous entrez cette commande est bash
ou yash
, vous pouvez même utiliser un nombre supérieur à 9 (bien que vous puissiez rencontrer des problèmes si le descripteur de fichier est utilisé en interne par le shell).
Si le shell à partir duquel vous appelez ce bash
script est zsh
, vous pouvez également faire:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
pour que la variable soit automatiquement affectée au premier fd libre supérieur à 9.
Pour les anciennes versions de bash
, une autre option, si le xtrace
est activé avec set -x
(par opposition à #! /bin/bash -x
ou set -o xtrace
) serait de redéfinir set
comme une fonction exportée qui ne fait rien une fois passée -x
(bien que cela briserait le script s'il (ou tout autre bash
script qu'il invoque) utilisé set
pour définir les paramètres de position).
Comme:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
Une autre option consiste à ajouter une interruption DEBUG dans un $BASH_ENV
fichier qui le fait set +x
avant chaque commande.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Cela ne fonctionnera pas quand set -x
c'est fait dans un sous-shell.
Comme l'a dit @ilkkachu, à condition d'avoir la permission d'écrire sur n'importe quel dossier du système de fichiers, vous devriez au moins être en mesure de faire une copie du script et de le modifier.
S'il n'y a nulle part où vous pouvez écrire une copie du script, ou s'il n'est pas pratique de créer et de modifier une nouvelle copie chaque fois qu'il y a une mise à jour du script original, vous pouvez toujours faire:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Cela (et l'approche de copie) peut ne pas fonctionner correctement si le script fait quelque chose d'extraordinaire avec $0
ou des variables spéciales comme $BASH_SOURCE
(comme la recherche de fichiers qui sont relatifs à l'emplacement du script lui-même), vous devrez donc peut-être faire plus d'édition comme remplacer $0
par le chemin du script ...
./script 2>some_file