Comment rediriger la sortie standard vers plusieurs fichiers journaux? Ce qui suit ne fonctionne pas:
some_command 1> output_log_1 output_log_2 2>&1
Voir man tee
:
NOM: tee - lire à partir de l'entrée standard et écrire sur la sortie standard et les fichiers
SYNOPSIS: tee [OPTION] ... [FICHIER] ...
En conséquence:
echo test | tee file1 file2 file3
Supposons que votre sortie soit générée à partir d'une fonction, cmd()
:
cmd() {
echo hello world!
}
Pour rediriger la sortie de cmd
vers deux fichiers, mais pas vers la console, vous pouvez utiliser:
cmd | tee file1 file2 >/dev/null
Cela fonctionnera pour plusieurs fichiers, compte tenu de la tuyauterie de source de données à té:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Cela fonctionnera également:
echo $(cmd) | tee file1 file2 >/dev/null
Sans la redirection /dev/null
, Tee enverra la sortie à stdout en plus aux fichiers spécifiés.
Par exemple, si cela est exécuté à partir de la console, vous y verrez la sortie. Exécutée à partir d'une crontab, la sortie apparaîtra le message d'état qui vous est envoyé (voir également la réponse de Gilles ici https://unix.stackexchange.com/a/100833/3998 ).
Cela a fonctionné pour moi dans bash sur Ubuntu 12.04, et a été vérifié dans Ubuntu 14.04 en utilisant GNU bash 4.3.11 (1), donc cela devrait fonctionner sur n'importe quelle version récente de GNU bash.
C'est un vieux post mais je viens de le trouver maintenant ...
Au lieu de rediriger la sortie vers > /dev/null
vous pouvez le rediriger vers le dernier fichier:
echo "foobarbaz" | tee file1 > file2
Ou pour ajouter la sortie:
echo "foobarbaz" | tee -a file1 >> file2
Comme @jofel l'a mentionné dans un commentaire sous la réponse, cela peut être fait nativement dans zsh
:
echo foobar >file1 >file2 >file3
ou, avec l'expansion de l'accolade:
echo foobar >file{1..3}
En interne, cela fonctionne de manière très similaire aux réponses tee
fournies ci-dessus. Le shell connecte la sortie standard de la commande à un processus qui redirige vers plusieurs fichiers; par conséquent, il n'y a aucun avantage technique convaincant à le faire de cette façon (mais cela a un aspect vraiment bon). Voir le manuel zsh
pour en savoir plus.
Impossible de commenter, cependant, une autre façon d'exprimer
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Pourrait être simplifié à cela, lorsqu'il s'agit de nombreux fichiers.
echo "foobarbaz" | tee file{1..8} > /dev/null