La accepté de réponse ne permet pas de conserver STDERR dans un fichier séparé descripteur. Cela signifie que
./script.sh >/dev/null
ne sera pas de sortie bar
à la borne, uniquement pour les fichiers de log, et
./script.sh 2>/dev/null
sortie à la fois foo
et bar
à la borne. Clairement ce n'est pas
le comportement d'un utilisateur normal est susceptible de s'attendre. Cela peut être
fixe à l'aide de deux différents tee processus à la fois en ajoutant à la même
fichier journal:
#!/bin/bash
exec > >(tee -a foo.log)
exec 2> >(tee -a foo.log >&2)
echo "foo"
echo "bar" >&2
(À noter que ce qui précède n'est pas d'abord de tronquer le fichier journal - si vous voulez que le comportement que vous devez ajouter
>foo.log
en haut du script.)
La POSIX.1-2008 date de spécification d' tee(1)
exige que la sortie est sans tampon, c'est à dire même pas en ligne de tampon, de sorte que dans ce cas, il est possible que STDOUT et STDERR pourrait se retrouver sur la même ligne d' foo.log
; toutefois, cela pourrait également se produire sur le terminal, de sorte que le fichier journal sera un fidèle reflet de ce qui pourrait être vu sur le terminal, si ce n'est un miroir exact. Si vous voulez la sortie standard les lignes clairement séparées de la STDERR lignes, envisager d'utiliser deux fichiers journaux, éventuellement avec timbre à date des préfixes sur chaque ligne pour permettre chronologique remontage plus tard.