En utilisant bash, comment copier stderr et stdout dans un fichier journal et les laisser également affichés sur la console?
Je voudrais le faire dans le script lui-même en utilisant un exec.
J'ai essayé avec
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Mais ce qui précède n'imprime rien sur la console. Comment puis-je y parvenir en bash?
Réponses:
Vous recherchez
tee
.Voir
man tee
pour plus de détails.Pour le combiner avec
exec
, vous devez utiliser la substitution de processus . (Voirman bash
pour plus de détails.)la source
exec 2>&1 | tee -a log.out
uniquement des impressions sur la console, rien dans le fichier journal. Peut-être que je n'utilise pas la bonne syntaxe?tee
en combinaison avec la substitution de processus .the-script | wc -l
par exemple, cela comptera également les lignes d'erreur et vous ne verrez pas les erreurs.Tu peux faire:
Vous pouvez également l'écrire comme suit:
Mais parce que bash n'attend pas les processus commencés par
>(...
), cela a parfois pour effet de sortir quelque chose vers le terminal après le retour de la commande, ce qui peut avoir des effets encore plus désagréables (comme rejeter silencieusement cette sortie) si l'attribut "tostop" du terminal est sur.Dans tous les cas, en créant
stdout
un canal dans les deux solutions, et parce que deux commandes produisent indépendamment les messages de sortie et d'erreur, cela affectera la mise en mémoire tampon de sortie et l'ordre d'affichage des messages de sortie et d'erreur.la source
tee -a log >&2 3>&-
Je sais que c'est un vieux post, mais pourquoi ne pas faire ça?
Et bien sûr, si vous voulez une sortie standard, vous pouvez simplement imprimer régulièrement.
Vous pouvez le faire avec n'importe quelle combinaison de flux que vous souhaitez, en utilisant simplement ces deux commandes de base.
Je sais que je suis venu ici et que je n'ai pas obtenu de réponse facile à comprendre / à mettre en œuvre, j'espère que cela aidera quelqu'un d'autre qui est en difficulté.
Soit dit en passant, pour les noobs là-bas comme mon moi précédent, tout ce que la
tee
commande fait est de sortir l'entrée stdin à la fois sur stdout et le ou les fichiers spécifiés comme arguments ultérieurs.-a
signifie append, donc vous n'écrasez pas le fichier à chaque utilisation de la commande. Si vous avez d'autres questions, je trouve que c'est une ressource très utile pour apprendre rapidement bash.la source
Une autre façon de procéder consiste à utiliser des redirections dans les fonctions.
Ici, nous avons une
main
fonction qui appelle toutes les autres fonctions. Maintenant , la réorientationSTDOUT
etSTDERR
de lamain
fonctiontee
.la source