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 tailarriè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 commandvers 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 teeprocessus qui lit à partir de STDIN et le sauvegarde dans stderr.log. teerenvoie son entrée sur STDOUT, mais comme son entrée est notre STDERR, nous voulons rediriger teele STDOUT de notre STDERR à nouveau. Ensuite, nous utilisons la redirection de fichiers pour rediriger commandle STDERR de l'entrée FIFO ( teele 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 bashvotre 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"