J'ai un script shell avec set -x
une sortie verbeuse / déboguée:
#!/bin/bash
set -x
command1
command2
...
La sortie ressemble à ceci:
+ command1
whatever output from command1
+ command2
whatever output from command2
Mon problème est, la sortie de la coquille (causée par set -x
) va au stderr, mélangé à la sortie des commandes ( command1
, command2
...). Je serais heureux d'avoir la sortie "normale" à l'écran (comme le script sans exécuter set -x
) et la sortie "extra" de bash séparément dans un fichier.
J'aimerais donc avoir ceci à l'écran:
whatever output from command1
whatever output from command2
et ceci dans un fichier journal:
+ command1
+ command2
(aussi bien si le fichier journal contient tout)
Le set -x 2> file
prendre de toute évidence doens't l'effet escompté, car ce n'est pas la sortie de la commande set, mais changer le comportement du bash.
L'utilisation bash 2> file
de l'intégralité du script ne fait pas non plus la bonne chose, car elle redirige également le stderr de chaque commande qui s'exécute dans ce shell, donc je ne vois pas le message d'erreur des commandes.
la source
Réponses:
Sur la base de cette réponse ServerFault Envoyer la sortie bash -x vers le fichier journal sans interrompre la sortie standard , les versions modernes de bash incluent
BASH_XTRACEFD
spécifiquement pour spécifier un autre descripteur de fichier pour la sortie deset -x
Ainsi, par exemple, vous pouvez faire
pour envoyer la sortie de
set -x
dans un fichierlogfile
tout en préservant la sortie standard régulière et les flux d'erreurs standard pour les commandes suivantes.Notez que l'utilisation de fd 19 est arbitraire - il suffit juste d'être un descripteur disponible (c'est-à-dire pas 0, 1, 2 ou un autre nombre que vous avez déjà alloué).
la source
Après plus d'un an, j'ai trouvé la bonne solution pour avoir à la fois la sortie "normale" (stdout + stderr - bash trace) à l'écran et tous ensemble (stdout + stderr + bash trace) dans un fichier (bash.log) :
la source
Steeldriver vous a donné une approche. Alternativement, vous pouvez simplement rediriger STDERR vers un fichier:
Cela signifie cependant que la sortie créée par l'
set -x
option et tout autre message d'erreur produit iront dans le fichier. La solution de Steeldriver ne redirigera que laset -x
sortie, ce qui est probablement ce que vous voulez.la source