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
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
Réponses:
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
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.
tee
commande écrit stdin
dans un fichier et aussi dans stdout
. Si vous ne voulez pas que la sortie apparaisse sur le terminal, vous devez rediriger /dev/null
comme vous le feriez normalement.
echo test | tee --append file1 file2
Disons que votre sortie est 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, 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/null
redirection, 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.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) dans Ubuntu 14.04.
C'est un ancien post mais je viens de le trouver maintenant ...
Au lieu de rediriger la sortie vers > /dev/null
vous, vous pouvez le rediriger vers le dernier fichier:
echo "foobarbaz" | tee file1 > file2
Ou pour ajouter la sortie:
echo "foobarbaz" | tee -a file1 >> file2
-a
en tee)
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 tee
ré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 zsh
manuel pour plus.
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
file1
par file8
leurs noms et ceux qui sont probablement juste un exemple pour les noms des espaces réservés des fichiers
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
tee
commande a déjà été mentionnée.
zsh
, vous pouvez utilisersome_command >output_log_1 >output_log_2
.