Existe-t-il un moyen de rediriger la sortie d'un programme tout en le faisant passer à stdout?

24

D'accord. Si je voulais rediriger la sortie d'un programme vers un fichier, je ferais quelque chose comme ça

prog > file

Si je voulais rediriger à la fois stdout et stderr vers ce fichier, je ferais

prog > file 2>&1

C'est très bien si vous voulez que la sortie aille dans le fichier. Mais que se passe-t-il si vous voulez que la sortie aille dans le fichier tout en restant dans stdout / stderr? Ainsi, la sortie est enregistrée dans le fichier, mais vous pouvez toujours la voir sur la console pendant l'exécution du programme. Y-a-t-il un moyen de faire ça? Et si oui, comment?

Jonathan M Davis
la source
Terminologie: vous voulez dire et toujours aller au terminal . stdoutest le descripteur de fichier 1, et foo > some_filesignifie qu'un descripteur de fichier en écriture seule ouvert sur some_fileest la sortie standard de foo. stdout va toujours à stdout.
Peter Cordes

Réponses:

39

teeexiste à cet effet; il prend un argument de nom de fichier et écrit les données qu'il lit de stdin dans stdout et dans le fichier:

$ prog 2>&1 | tee file
Michael Mrozek
la source
10
Et pour bash supplémentaire 4 mignardise: prog |& tee file.
Tobu
1
Vous pouvez également remplacer «fichier» par un canal nommé ...
Kevin Cantu
@KevinCantu: Un canal nommé n'est qu'un type de fichier; c'est Unix où tout est un fichier. Vous pouvez également prog |& tee /dev/tty > file, ce qui peut être utile au milieu d'un pipeline, par exemple foo |& tee /dev/tty | sed 's/.*\r//' > foo.logpour voir les mises à jour de progression de la ligne d'état sur votre terminal, mais les filtrer hors d'un fichier journal. Ou utilisez-le pour déboguer un pipeline que vous piratez ensemble en vous permettant de voir les données à ce stade.
Peter Cordes