Je suppose que vous voulez toujours voir STDERR et STDOUT sur le terminal. Vous pourriez opter pour la réponse de Josh Kelley, mais je trouve que le fait de garder une tail
en arrière-plan, ce qui rend votre fichier journal très compliqué et maladroit. Remarquez que vous devez garder un FD exra et faire le nettoyage après coup en le tuant, et que techniquement, vous devriez le faire dans un fichier trap '...' EXIT
.
Il y a une meilleure façon de faire, et vous l'avez déjà découverte : tee
.
Seulement, au lieu de l'utiliser uniquement pour votre stdout, ayez un tee pour stdout et un pour stderr. Comment allez-vous procéder ? Substitution de processus et redirection de fichiers :
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Divisons-nous et expliquons :
> >(..)
>(...)
(substitution de processus) crée un FIFO et permet à tee
écoutez-la. Ensuite, il utilise >
(redirection de fichier) pour rediriger le STDOUT de command
à la FIFO que votre premier tee
est à l'écoute.
Même chose pour le second :
2> >(tee -a stderr.log >&2)
Nous utilisons à nouveau la substitution de processus pour faire un tee
qui lit à partir de STDIN et le dépose dans le fichier stderr.log
. tee
renvoie son entrée sur STDOUT, mais comme son entrée est notre STDERR, nous voulons rediriger tee
de la STDOUT de l'utilisateur vers notre STDERR. Ensuite, nous utilisons la redirection de fichiers pour rediriger command
de STDERR vers l'entrée de la FIFO ( tee
de STDIN).
Voir http://mywiki.wooledge.org/BashGuide/InputAndOutput
La substitution de processus est l'une de ces choses vraiment charmantes que vous obtenez en prime en choisissant bash
comme interpréteur de commandes, par opposition à sh
(POSIX ou Bourne).
Sur sh
il faut faire les choses manuellement :
out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"
2 votes
Pour clarifier - voulez-vous que stderr aille à l'écran aussi bien qu'au fichier ?
0 votes
C'est le cas, je vais modifier mon message pour le préciser. Je pense que la solution de lhunath suffira. Merci à tous pour votre aide !