comment rediriger la sortie vers plusieurs fichiers journaux

52

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
autobus à impériale
la source
6
Avec zsh, vous pouvez utiliser some_command >output_log_1 >output_log_2.
Jofel

Réponses:

70

Voir man tee:

NOM: tee - lit depuis l'entrée standard et écrit dans la sortie standard et les fichiers

SYNOPSIS: tee [OPTION] ... [FILE] ...

En conséquence:

echo test | tee file1 file2 file3
akond
la source
le stderr peut-il également être redirigé dans plusieurs fichiers?
fromnaboo
Oui, cela peut être fait par redirection: find / -name test 2> & 1 | tee file1 file2 file3
akond
@akond, cmd 2>&1 | tee log1 log2 j'ai essayé de procéder comme ci-dessus, mais je dois appuyer sur ctrl-c pour le rediriger vers un deuxième fichier journal. le résultat est également imprimé sur la console. Je veux que la sortie de commande soit redirigée vers les journaux mais pas sur la console. toute aide est appréciée.
doubledecker
@doubledecker La teecommande écrit stdindans un fichier et aussi dans stdout. Si vous ne voulez pas que la sortie apparaisse sur le terminal, vous devez rediriger /dev/nullcomme vous le feriez normalement.
Minix
4
Il est également possible d'ajouter à plusieurs fichiers:echo test | tee --append file1 file2
user1364368
13

Disons que votre sortie est générée à partir d'une fonction cmd():

cmd() {
    echo hello world!
}

Pour rediriger la sortie de cmdvers deux fichiers, mais pas vers la console, vous pouvez utiliser:

cmd | tee file1 file2 >/dev/null

Cela fonctionnera pour plusieurs fichiers, en fonction de la canalisation de source de données à prendre en compte:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

Cela fonctionnera également:

echo $(cmd) | tee file1 file2 >/dev/null

Sans la /dev/nullredirection, tee enverra une sortie à stdout en plus des fichiers spécifiés.

Par exemple, s'il est exécuté à partir de la console, vous verrez la sortie à cet endroit. Exécuté depuis une crontab, le message d’état qui vous sera envoyé par la sortie apparaîtra (voir aussi 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 avec GNU bash 4.3.11 (1), donc cela devrait fonctionner sur toute version récente de GNU bash.

KP MacGregor
la source
@doubledecker - cela semble répondre à vos conditions et peut donc être accepté comme solution. En outre, +1 comme cela a été testé sous GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) dans Ubuntu 14.04.
Belacqua
9

C'est un ancien post mais je viens de le trouver maintenant ...

Au lieu de rediriger la sortie vers > /dev/nullvous, vous pouvez le rediriger vers le dernier fichier:

echo "foobarbaz" | tee file1 > file2

Ou pour ajouter la sortie:

echo "foobarbaz" | tee -a file1 >> file2
James cook
la source
c'est plus ou moins ce que dit l'autre réponse (sauf -a en tee)
Archemar, le
C'est le chemin à parcourir.
71GA
5

Comme @jofel l'a mentionné dans un commentaire sous la réponse, cela peut être fait de manière native dans zsh:

echo foobar >file1 >file2 >file3

ou, avec expansion du corset:

echo foobar >file{1..3}

En interne, cela fonctionne de manière très similaire aux teeréponses fournies ci-dessus. Le shell connecte la sortie standard de la commande à un processus qui dirige plusieurs fichiers; , il n'y a donc aucun avantage technique convaincant pour le faire de cette façon (mais il ne semble vraiment bien). Voir le zshmanuel pour plus.

combattant
la source
2

Incapable 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, quand on traite de nombreux fichiers.

echo "foobarbaz" | tee file{1..8} > /dev/null
utilisateur149146
la source
2
En quoi est-ce vraiment différent des autres réponses déjà données? D' autant plus que peu de gens veulent probablement littéralement file1par file8leurs noms et ceux qui sont probablement juste un exemple pour les noms des espaces réservés des fichiers
Eric Renouf
1
Probablement ou pas, c'est exactement la solution dont j'avais besoin et je pensais que cela pourrait aider quelqu'un d'autre.
user149146
-2

J'avais besoin d'un fichier journal de session et d'un autre fichier pour toutes les sessions que j'ai effectuées:

echo blabla |tee thisession >>allsessions

Gediz GÜRSU
la source
La teecommande a déjà été mentionnée.
RalfFriedl