web-dev-qa-db-fra.com

comment rediriger la sortie vers plusieurs fichiers journaux

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
55
doubledecker

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
73
akond

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.

13
K. P. MacGregor

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
10
James Cook

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.

5
strugee

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
2
user149146