GNU/Linux >> Tutoriels Linux >  >> Linux

Comment rediriger la sortie vers un fichier et stdout

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


Linux
  1. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  2. Comment rediriger la sortie d'un programme vers un fichier Zip ? ?

  3. Sortie vers Stdout et en même temps Grep dans un fichier ?

  4. Manière de rediriger la sortie d'un programme et de l'avoir toujours sur Stdout ?

  5. Comment rediriger Stderr et Stdout vers différents fichiers et également les afficher dans le terminal ?

Comment rediriger stderr vers stdout dans Bash

Comment rediriger la sortie de la commande shell

Comment rediriger la sortie du service systemd vers un fichier

Comment rediriger toute la sortie de spark-submit vers un fichier

bash :redirige stderr vers le fichier et stdout + stderr vers l'écran

Capture de STDERR et STDOUT dans un fichier à l'aide de tee