La sortie de -x va vers stderr, pas stdout. Mais même cela peut être un problème - de nombreux scripts auront des dépendances fonctionnelles sur le contenu de stderr, et son genre de désordre d'avoir le débogage et les flux stderr mélangés dans certains cas.
Les versions Bash> 4.1 offrent une solution différente: la variable d'environnement BASH_XTRACEFD vous permet de spécifier un descripteur de fichier qui sera utilisé pour envoyer le flux de débogage à. Cela peut être un fichier ou un tuyau ou toute autre bonté unix-y que vous aimez.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
Avec un peu plus de violon, vous pouvez faire d'autres choses - comme faire un `` tee '' sur les flux stdout et / ou stdin, et entrelacer ceux avec la sortie de débogage, afin que votre journal soit plus complet. Pour plus de détails à ce sujet, voir /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Le gros avantage de cette approche par rapport aux alternatives est que vous ne risquez pas de modifier le comportement de votre script en injectant une sortie de débogage dans stdout ou stderr.
exec 19>&-
)? D'après mon expérience, il est fermé automatiquement lorsque le script se termine.set -x
n'envoie rien à la sortie standard, il n'y a donc aucun problème. Ce qu'il fait , c'est écrire sur l'erreur standard, qui va à la console par défaut.Ce que vous voulez faire, c'est rediriger stdout vers un autre fichier, comme ceci:
la source
Tu vois
man tee
.Vous l'exécutez comme
tee commandname filename
et il affichera la sortie des commandesstdout
et l'écrira égalementfilename
.la source