Comment enregistrer la sortie d'une commande dans un fichier?
Y a-t-il un moyen sans utiliser de logiciel? J'aimerais savoir comment.
Comment enregistrer la sortie d'une commande dans un fichier?
Y a-t-il un moyen sans utiliser de logiciel? J'aimerais savoir comment.
Oui c'est possible, il suffit de rediriger la sortie (AKA stdout
) à un fichier:
SomeCommand > SomeFile.txt
Ou si vous souhaitez ajouter des données:
SomeCommand >> SomeFile.txt
Si tu veux stderr
aussi bien utiliser ceci:
SomeCommand &> SomeFile.txt
ou ceci à ajouter:
SomeCommand &>> SomeFile.txt
si vous voulez avoir les deux stderr
et sortie affiché sur la console et dans un fichier utilisez ceci:
SomeCommand 2>&1 | tee SomeFile.txt
(Si vous voulez uniquement la sortie, supprimez le 2
surtout)
Pour écrire la sortie d'une commande dans un fichier, il existe essentiellement 10 méthodes couramment utilisées.
Veuillez noter que le
n.e.
dans la colonne de syntaxe signifie "non existant".
Il y a un moyen, mais c'est trop compliqué pour rentrer 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é uniquement vers le fichier, 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é uniquement vers le fichier, 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
La sortie standard et 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
La sortie standard et 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 abrégée qui permet de diriger uniquement StdErr vers une deuxième commande, ce qui serait nécessaire ici en combinaison avec tee
encore une fois pour compléter le tableau. Si vous avez vraiment besoin de quelque chose comme ça, veuillez regarder "Comment canaliser stderr et non stdout?"sur le débordement de pile pour certaines façons, cela peut être fait, par exemple en échangeant des flux ou en utilisant la substitution de processus.
command |& tee output.txt
Les flux de sortie standard et d'erreur standard seront copiés dans le fichier tout en étant visibles dans le terminal. Si le fichier existe déjà, il est écrasé.
command |& tee -a output.txt
Les flux de sortie standard et d'erreur standard seront copiés dans le fichier tout en étant visibles dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.
Vous pouvez également utiliser tee
pour envoyer la sortie à un fichier:
command | tee ~/outputfile.txt
Une légère modification attrapera également stderr:
command 2>&1 | tee ~/outputfile.txt
ou un peu plus court et moins compliqué:
command |& tee ~/outputfile.txt
tee
est utile si vous voulez pouvoir capturez la sortie de la 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 voudrez 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
Il y a deux questions différentes ici. Le premier est dans le titre:
Comment enregistrer la sortie du terminal dans un fichier?
La deuxième question est dans le corps:
Comment enregistrer la sortie d'une commande dans un fichier?
Toutes les réponses publiées ici traitent de la deuxième question, mais aucune ne traite de la première question qui a une excellente réponse dans Unix et Linux:
Cette réponse utilise une commande peu connue appelée script
qui enregistre toutes les sorties de votre shell dans un fichier texte jusqu'à ce que vous tapiez exit
. La sortie de la commande apparaît toujours sur votre écran mais apparaît également dans le fichier texte.
Le processus est simple. Utiliser:
$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt
Ensuite, regardez votre sortie enregistrée des commandes 1, 2 et 3 avec:
cat ~/outputfile.txt
Ceci est similaire à réponse antérieure de:
command |& tee ~/outputfile.txt
|& tee ~/outputfile.txt
après chaque commnd
.script
la commande a ajouté l'avantage (ou l'inconvénient) du rechargement ~/.bashrc
quand ça commence.script
commande affiche l'invite de commande ($PS1
) suivi de la(des) commande (s) que vous avez saisie (s).script
la commande enregistre tous les détails en couleur.Pour cron
vous voulez éviter les extensions Bash. L'équivalent POSIX sh
les opérateurs de redirection sont
Bash POSIX------------ --------------foo &> bar foo >bar 2>&1foo &>> bar foo >>bar 2>&1foo |& bar foo 2>&1 | bar
Vous remarquerez que l'installation POSIX est en quelque sorte plus simple et plus directe. 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 n'enregistrent 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 expectunbuffer some_command | tee command.logunbuffer some_command > command.log
Supposer log.py
contenir:
import timeprint('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'informations: Comment puis-je enregistrer une sortie de commande dans un fichier en temps réel?
Si vous souhaitez afficher le fichier pendant l'exécution de la commande:
script -c ./path/to/executable.bash -f log.txt