La commande que vous voulez est nommée tee
:
foo | tee output.file
Par exemple, si vous ne vous souciez que de stdout :
ls -a | tee output.file
Si vous souhaitez inclure stderr, faites :
program [arguments...] 2>&1 | tee outfile
2>&1
redirige le canal 2 (stderr/erreur standard) vers le canal 1 (stdout/sortie standard), de sorte que les deux soient écrits en tant que stdout. Il est également dirigé vers le fichier de sortie donné à partir du tee
commande.
De plus, si vous souhaitez ajouter au fichier journal, utilisez tee -a
comme :
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
vide les flux stderr et stdout.tee outfile
prend le flux qu'il reçoit et l'écrit à l'écran et dans le 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 sortie. L'utilisateur souhaite 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 qu'il y a une dépendance à l'égard des flux vidés par le programme. Si, par exemple, toutes les écritures sur stdout ne sont pas vidé, mais toutes les écritures sur stderr sont vidés, ils se retrouveront dans le désordre dans le fichier de sortie et à l'écran.
C'est également mauvais si le programme ne produit que 1 ou 2 lignes toutes les quelques minutes pour signaler les progrès. Dans un tel cas, si la sortie n'était pas vidée par le programme, l'utilisateur ne verrait même aucune sortie à l'écran pendant des heures, car rien de tout cela ne serait poussé dans le tuyau pendant des heures.
Mise à jour :Le programme unbuffer
, partie du expect
package, résoudra le problème de mise en mémoire tampon. Cela entraînera l'écriture immédiate de stdout et stderr sur l'écran et le fichier et les maintiendra synchronisés lorsqu'ils seront combinés et redirigés vers tee
. Ex. :
$ unbuffer program [arguments...] 2>&1 | tee outfile
Une autre façon qui fonctionne pour moi est,
<command> |& tee <outputFile>
comme indiqué dans le manuel de gnu bash
Exemple :
ls |& tee files.txt
Si '|&' est utilisé, l'erreur standard de la commande1 , en plus de sa sortie standard , est connecté à l'entrée standard de command2 via le tube ; c'est un 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, reportez-vous à la redirection