Je suppose que vous voulez toujours voir STDERR et STDOUT sur le terminal. Vous pouvez opter pour la réponse de Josh Kelley, mais je trouve que garder un tail
arrière-plan qui génère votre fichier journal est très hackish et maladroit. Remarquez comment vous devez conserver un exra FD et faire le nettoyage par la suite en le tuant et que vous devriez techniquement le faire dans a trap '...' EXIT
.
Il y a une meilleure façon de faire, et que vous avez déjà découvert: tee
.
Seulement, au lieu de simplement l'utiliser pour votre stdout, ayez un tee pour stdout et un pour stderr. Comment allez-vous y parvenir? Substitution de processus et redirection de fichiers:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Divisons-le et expliquons:
> >(..)
>(...)
(substitution de processus) crée un FIFO et permet de l' tee
écouter. Ensuite, il utilise >
(redirection de fichiers) pour rediriger le STDOUT de command
vers le FIFO que votre premier tee
écoute.
Même chose pour le second:
2> >(tee -a stderr.log >&2)
Nous utilisons à nouveau la substitution de processus pour créer un tee
processus qui lit à partir de STDIN et le sauvegarde dans stderr.log
. tee
renvoie son entrée sur STDOUT, mais comme son entrée est notre STDERR, nous voulons rediriger tee
le STDOUT de notre STDERR à nouveau. Ensuite, nous utilisons la redirection de fichiers pour rediriger command
le STDERR de l'entrée FIFO ( tee
le STDIN).
Voir http://mywiki.wooledge.org/BashGuide/InputAndOutput
La substitution de processus est l'une de ces très belles choses que vous obtenez en prime de choisir bash
votre shell par opposition à sh
(POSIX ou Bourne).
Dans sh
, vous devez 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"