Question Comment rediriger la sortie vers un fichier et une sortie standard


In bash, appeler foo afficherait n'importe quelle sortie de cette commande sur la sortie standard.

Appel foo > output redirigerait toute sortie de cette commande vers le fichier spécifié (dans ce cas, 'output').

Existe-t-il un moyen de rediriger la sortie vers un fichier et l'afficher sur stdout?


650
2018-01-07 01:45


origine


Réponses:


La commande que vous voulez est nommée tee:

foo | tee output.file

Par exemple, si vous vous souciez seulement de stdout:

ls -a | tee output.file

Si vous voulez inclure stderr, faites:

program [arguments...] 2>&1 | tee outfile

2>&1 redirige le canal 2 (erreur stderr / standard) dans le canal 1 (sortie stdout / standard), de sorte que les deux sont écrits en tant que stdout. Il est également dirigé vers le fichier de sortie donné à partir du tee commander.

De plus, si vous voulez ajouter dans le fichier journal, utilisez tee -a comme:

program [arguments...] 2>&1 | tee -a outfile

881
2018-01-07 01:48



$ program [arguments...] 2>&1 | tee outfile

2>&1 vide les flux stderr et stdout. tee outfile prend le flux qu'il obtient et l'écrit à l'écran et au fichier "outfile".

C'est probablement ce que la plupart des gens recherchent. La situation probable est qu'un programme ou un script travaille dur pendant longtemps et produit beaucoup de résultats. L'utilisateur veut vérifier périodiquement la progression, mais souhaite également que la sortie soit écrite dans un fichier.

Le problème (en particulier lors du mélange de flux stdout et stderr) est que les flux sont vidés par le programme. Si, par exemple, toutes les écritures sur stdout sont ne pas rincé, mais toutes les écritures à stderr sont rincé, alors ils finiront hors de l'ordre chronologique dans le fichier de sortie et sur l'écran.

C'est également mauvais si le programme ne sort que 1 ou 2 lignes toutes les quelques minutes pour signaler les progrès. Dans un tel cas, si la sortie n'a pas été vidée par le programme, l'utilisateur ne verrait même pas de sortie sur l'écran pendant des heures, parce que rien ne serait poussé dans le tuyau pendant des heures.

Mise à jour: Le programme unbuffer, partie de la expect package, va résoudre le problème de mise en mémoire tampon. Cela entraînera stdout et stderr à écrire sur l'écran et le fichier immédiatement et à les synchroniser lors de la combinaison et de la redirection vers tee. Par exemple.:

$ unbuffer program [arguments...] 2>&1 | tee outfile

441
2017-08-28 05:38



Une autre façon qui fonctionne pour moi est,

<command> |& tee  <outputFile>

comme représenté sur la gnu bash manuel

Exemple:

ls |& tee files.txt

Si '| &' est utilisé, command1 erreur standard, en plus de son sortie standard, est connecté à l'entrée standard de command2 à travers le tuyau; c'est raccourci pour 2> & 1 |. Cette redirection implicite de l'erreur standard vers la sortie standard est effectuée après toute redirection spécifiée par la commande. 

Pour plus d'informations, référez-vous redirection 


91
2018-03-20 10:03



Vous pouvez principalement utiliser Zoredache  Solution, mais si vous ne voulez pas écraser le fichier de sortie, vous devez écrire tee avec l'option -a comme suit:

ls -lR / | tee -a output.file

16
2017-08-15 00:18



Quelque chose à ajouter ...

L'unbuffer du paquet a des problèmes de support avec certains paquets sous les versions Fedora et redhat Unix.

Mettre de côté les problèmes

Suite a travaillé pour moi

bash myscript.sh 2>&1 | tee output.log

Je vous remercie ScDF & Matthieu vos entrées m'ont sauvé beaucoup de temps ..


9
2018-06-26 10:10



en utilisant tail -f output devrait marcher.


7
2018-01-07 01:50



Réponse bonus puisque ce cas d'utilisation m'a amené ici:

Dans le cas où vous avez besoin de faire cela comme un autre utilisateur 

echo "some output" | sudo -u some_user tee /some/path/some_file

Notez que l'écho se produira car vous et l'écriture de fichier se produira comme "some_user" ce qui va NE PAS Le travail est si vous deviez exécuter l'écho comme "some_user" et rediriger la sortie avec >> "some_file" parce que la redirection de fichier se passera comme vous.

Astuce: le tee prend également en charge l'adjonction de l'option -a, si vous devez remplacer une ligne dans un fichier par un autre utilisateur, vous pouvez exécuter sed en tant qu'utilisateur souhaité.


3
2017-10-22 17:55



< command > |& tee filename # ceci créera un fichier "nom de fichier" avec l'état de la commande en tant que contenu. Si un fichier existe déjà, il supprimera le contenu existant et écrira l'état de la commande.

< command > | tee >> filename # ceci ajoutera l'état au fichier mais il n'imprime pas l'état de la commande sur standard_output (écran).

Je veux imprimer quelque chose en utilisant "echo" sur l'écran et ajouter ces données en écho dans un fichier

echo "hi there, Have to print this on screen and append to a file" 

0
2018-02-01 16:25



tee est parfait pour cela, mais cela fera aussi le travail

ls -lr / > output | cat output

-10
2018-01-07 02:47