Question Comment enregistrer la sortie du terminal dans un fichier?


Comment enregistrer la sortie d'une commande dans un fichier?

Y a-t-il un moyen sans utiliser de logiciel? Je voudrais savoir comment.


394
2018-02-14 19:49


origine




Réponses:


Oui, il est possible de rediriger la sortie vers un fichier:

someCommand > someFile.txt  

Ou si vous voulez ajouter des données:

someCommand >> someFile.txt

Si tu veux stderr aussi utiliser ceci:

someCommand &> someFile.txt  

ou ceci pour ajouter:

someCommand &>> someFile.txt  

388
2018-02-14 19:52



Notez que someCommand 2> someFile.txt et someCommand 2>> someFile.txt redirige également stterr à someFile.txt - Slothworks
J'essaie de faire cela avec la commande gcc mais ça ne marche pas. Cela fonctionne avec d'autres commandes, mais pas celle-ci. Il crée simplement le fichier de sortie avec rien à l'intérieur. - Nik-Lz
@ Nik-Lz Souvent, c'est parce que la commande envoie toutes ses sorties sur stderr. Si gcc génère des messages d'erreur, cela semble probable. Voir le commentaire Slothworks pour savoir comment capturer stderr au lieu de stdout. - Jonathan Hartley
NB: pour obtenir la sortie du make commande dans un fichier nécessite cette syntaxe à la place: make > someFile.txt 2>&1 (la source: linuxquestions.org/questions/linux-newbie-8/…) - Gabriel Staples
@KyleBridenstine Voir le tee Réponse ci-dessous (askubuntu.com/a/485762/44179) - Seth♦


Pour écrire la sortie d'une commande dans un fichier, il existe essentiellement 10 méthodes couramment utilisées.

Aperçu:

S'il vous plaît noter que le n.e. dans la colonne de syntaxe signifie "non existant".
  Il y a un moyen, mais c'est trop compliqué pour tenir dans la colonne. Vous pouvez trouver un lien utile dans la section Liste à ce sujet.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Liste:

  • command > output.txt

    Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command >> output.txt

    Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command 2> output.txt

    Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command 2>> output.txt

    Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command &> output.txt

    Tant la sortie standard que le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command &>> output.txt

    Tant la sortie standard que le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command | tee output.txt

    Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command | tee -a output.txt

    Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • (*)

    Bash n’a pas de syntaxe raccourcie qui permet de ne canaliser que StdErr vers une seconde commande, qui serait nécessaire ici en combinaison avec tee encore pour compléter le tableau. Si vous avez vraiment besoin de quelque chose comme ça, veuillez regarder "Comment canaliser stderr, et pas stdout?" sur débordement de pile pour certains moyens, comment cela peut être fait, par ex. en échangeant des flux ou en utilisant une substitution de processus.

  • command |& tee output.txt

    La sortie standard et les flux d'erreur standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command |& tee -a output.txt

    La sortie standard et les flux d'erreur standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.


535
2018-02-08 14:52



Merci pour la table, c'est excellent! Cela devrait être la meilleure réponse - DevShark
@ karthick87 Ceci n'est pas vraiment lié à la question de la redirection de la sortie vers un fichier, car il ne fait que rediriger un flux vers un autre. 2>&1 redirige STDERR vers STDOUT, 1>&2 redirige STDOUT vers STDERR et 3>&1 redirigerait le flux 3 vers STDERR. - Byte Commander
Juste une note que "| &" ne fonctionnait pas pour moi sur macOS. Cela est dû au fait qu’il possède une version plus ancienne de bash (je pense). Les moins élégants '2> & 1 |' fonctionne bien si - Danny Parker
Qu'en est-il de n, y, y, y? - user1133275
@Jas pour rediriger les deux flux stderr (2) et stdout (1). - Byte Commander


Vous pouvez aussi utiliser tee envoyer la sortie dans un fichier:

command | tee ~/outputfile.txt

Une légère modification permettra également d'attraper stderr:

command 2>&1 | tee ~/outputfile.txt

ou légèrement plus court et moins compliqué:

command |& tee ~/outputfile.txt

tee est utile si vous voulez pouvoir capturer la sortie de commande tout en la visualisant en direct.


81
2018-06-20 04:45



tee est utile si vous souhaitez être en mesure de capturer la sortie de commande tout en la visualisant en direct. Faire cette ligne audacieux Aaron. Cela fera deux emplois à la fois. Merci pour la réponse. - learner
Il dit que le & est inattendu et n'écrit pas le journal en même temps que la commande s'exécute. Je l'utilise dans un fichier bash, cela fait-il une différence? - tim687
@ tim687 J'ai supprimé cette modification. Désolé pour ça ... ne faisait pas partie de ma réponse originale. - Aaron
@Aaron Merci! tee ajoutera le fichier en temps réel, non? J'ai un script de sauvegarde que j'utilise pour, lol, sauvegarder mon PC, mais la journalisation n'est pas en temps réel. Mon PC se met en veille après la fin de la sauvegarde et le fichier journal est vide. Dois-je utiliser une autre commande pour enregistrer les commandes? - tim687
milliards merci frère - Mahesha999


Vous pouvez rediriger la sortie de la commande vers un fichier:

your_command >/path/to/file

Pour ajouter la sortie de la commande à un fichier au lieu de l'écraser, utilisez:

your_command >>/path/to/file

17
2018-02-14 19:52



Merci beaucoup ! Y a-t-il des limites? comme la taille maximale du fichier? - led-Zepp
La taille maximale du fichier est limitée par le système de fichiers - chaos
Cette réponse ne sauvera pas stderr. Utilisez &>, voir stackoverflow.com/questions/637827/… et tldp.org/LDP/abs/html/io-redirection.html - Panther
L'OP n'a jamais demandé à sauver stderr - chaos


Une amélioration à considérer -

Divers scripts injecteront des codes de couleur dans la sortie que vous ne souhaiterez peut-être pas encombrer votre fichier journal.

Pour résoudre ce problème, vous pouvez utiliser le programme sed pour supprimer ces codes. Exemple:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



Comment sauvegarder la sortie de manière à conserver les couleurs? Je voudrais importer le résultat d'une commande dans libreoffice et conserver les couleurs. - madrang
@madrang: Je lis seulement votre commentaire maintenant, mais vous pouvez le trouver répondre utile. - Sylvain Pineau
Oh, presque exactement ce que je recherche. Comment imprimer également à l'écran la sortie? - Sigur
Notez que de nombreuses commandes produisant une sortie colorisée, telles que ls et grep, soutien --color=auto, qui génère des codes couleur uniquement si la sortie standard est un terminal. - Eliah Kagan


Pour cron jobs etc vous souhaitez éviter les extensions Bash. L'équivalent POSIX sh les opérateurs de redirection sont

Bash            POSIX
--------------  --------------
foo &> bar      foo >bar 2&>1
foo &>> bar     foo >>bar 2>&1
foo |& bar      foo 2>&1 | bar

Vous remarquerez que l'installation POSIX est en quelque sorte plus simple et plus simple. le &> la syntaxe a été empruntée à csh ce qui devrait déjà vous convaincre que c'est une mauvaise idée.


1
2018-04-11 12:25





some_command | tee command.log et some_command > command.log ont le problème qu'ils ne sauvegardent pas la sortie de la commande dans le command.log fichier en temps réel.

Pour éviter ce problème et enregistrer la sortie de la commande en temps réel, vous pouvez ajouter unbuffer, qui vient avec le expect paquet.


Exemple:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

En supposant log.py contient:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

tu peux courir unbuffer python log.py | tee command.log ou unbuffer python log.py > command.log

Plus d'information: Comment enregistrer une sortie de commande dans un fichier en temps réel?


0
2017-07-04 20:54



Ils enregistrent la sortie au fur et à mesure qu'ils la reçoivent, mais le problème est que Python active la mise en mémoire tampon lorsque la sortie n'est pas en TTY. Autres options pour désactiver cela en Python: stackoverflow.com/q/107705/2072269 - muru