Comment enregistrer la sortie d'une commande dans un fichier?
Y a-t-il un moyen sans utiliser de logiciel? Je voudrais savoir comment.
Comment enregistrer la sortie d'une commande dans un fichier?
Y a-t-il un moyen sans utiliser de logiciel? Je voudrais savoir comment.
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
Pour écrire la sortie d'une commande dans un fichier, il existe essentiellement 10 méthodes couramment utilisées.
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
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.
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.
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
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
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.
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?