Vraag Hoe bewaar ik terminaluitvoer in een bestand?


Hoe sla ik de uitvoer van een opdracht op in een bestand?

Is er een manier zonder software te gebruiken? Ik zou graag willen weten hoe.


394
2018-02-14 19:49


oorsprong




antwoorden:


Ja, het is mogelijk, stuur de uitvoer om naar een bestand:

someCommand > someFile.txt  

Of als u gegevens wilt toevoegen:

someCommand >> someFile.txt

Als je wil stderr gebruik dit ook:

someCommand &> someFile.txt  

of dit om toe te voegen:

someCommand &>> someFile.txt  

388
2018-02-14 19:52



Let daar op someCommand 2> someFile.txt en someCommand 2>> someFile.txt ook doorverwijzingen stterr naar someFile.txt - Slothworks
Ik probeer dit te doen met gcc commando, maar het werkt niet. Het werkt met andere opdrachten, maar deze niet. Het maakt eenvoudig het uitvoerbestand met niets erin. - Nik-Lz
@ Nik-Lz Vaak is dit omdat de opdracht al zijn uitvoer op stderr verzendt. Als gcc foutmeldingen genereert, lijkt dit waarschijnlijk. Zie commentaar van Slothworks voor het opnemen van stderr in plaats van stdout. - Jonathan Hartley
NB: om de uitvoer van de make opdracht in een bestand vereist het in plaats daarvan deze syntaxis: make > someFile.txt 2>&1 (bron: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
@KyleBridenstine Zie de tee antwoord hieronder (askubuntu.com/a/485762/44179) - Seth♦


Om de uitvoer van een opdracht naar een bestand te schrijven, zijn er feitelijk 10 veelgebruikte manieren.

Overzicht:

Houd er rekening mee dat de n.e. in de kolom syntaxis betekent "niet bestaand".
  Er is een manier, maar het is te ingewikkeld om in de kolom te passen. U kunt een nuttige link vinden in het gedeelte Lijst erover.

          || 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

Lijst:

  • command > output.txt

    De standaard uitvoerstroom wordt alleen naar het bestand omgeleid en is niet zichtbaar in de terminal. Als het bestand al bestaat, wordt het overschreven.

  • command >> output.txt

    De standaard uitvoerstroom wordt alleen naar het bestand omgeleid en is niet zichtbaar in de terminal. Als het bestand al bestaat, worden de nieuwe gegevens toegevoegd aan het einde van het bestand.

  • command 2> output.txt

    De standaard foutstroom zal alleen naar het bestand worden omgeleid, deze zal niet zichtbaar zijn in de terminal. Als het bestand al bestaat, wordt het overschreven.

  • command 2>> output.txt

    De standaard foutstroom zal alleen naar het bestand worden omgeleid, deze zal niet zichtbaar zijn in de terminal. Als het bestand al bestaat, worden de nieuwe gegevens toegevoegd aan het einde van het bestand.

  • command &> output.txt

    Zowel de standaarduitvoer als de standaardfoutenstroom zullen alleen naar het bestand worden omgeleid, niets zal zichtbaar zijn in de terminal. Als het bestand al bestaat, wordt het overschreven.

  • command &>> output.txt

    Zowel de standaarduitvoer als de standaardfoutenstroom zullen alleen naar het bestand worden omgeleid, niets zal zichtbaar zijn in de terminal. Als het bestand al bestaat, worden de nieuwe gegevens toegevoegd aan het einde van het bestand ..

  • command | tee output.txt

    De standaard uitvoerstroom wordt gekopieerd naar het bestand, het is nog steeds zichtbaar in de terminal. Als het bestand al bestaat, wordt het overschreven.

  • command | tee -a output.txt

    De standaard uitvoerstroom wordt gekopieerd naar het bestand, het is nog steeds zichtbaar in de terminal. Als het bestand al bestaat, worden de nieuwe gegevens toegevoegd aan het einde van het bestand.

  • (*)

    Bash heeft geen syntaxis van steno waarmee alleen StdErr aan een tweede commando kan worden doorverbonden, wat hier in combinatie met tee nogmaals om de tafel te voltooien. Als je echt iets dergelijks nodig hebt, kijk alsjeblieft "Hoe pijp stderr, en niet stdout?" op Stack Overflow voor sommige manieren hoe dit kan worden gedaan b.v. door streams om te wisselen of procesvervanging te gebruiken.

  • command |& tee output.txt

    Zowel de standaarduitvoer- als standaardfoutenstromen worden gekopieerd naar het bestand terwijl ze nog steeds zichtbaar zijn in de terminal. Als het bestand al bestaat, wordt het overschreven.

  • command |& tee -a output.txt

    Zowel de standaarduitvoer- als standaardfoutenstromen worden gekopieerd naar het bestand terwijl ze nog steeds zichtbaar zijn in de terminal. Als het bestand al bestaat, worden de nieuwe gegevens toegevoegd aan het einde van het bestand.


535
2018-02-08 14:52



Bedankt voor de tafel, het is uitstekend! Dit zou het beste antwoord moeten zijn - DevShark
@ karthick87 Dit is niet echt gerelateerd aan de vraag over het omleiden van uitvoer naar een bestand, omdat het alleen maar de ene stroom naar de andere doorstuurt. 2>&1 leidt STDERR om naar STDOUT, 1>&2 leidt STDOUT om naar STDERR en 3>&1 zou stream 3 doorsturen naar STDERR. - Byte Commander
Gewoon een opmerking dat '| &' niet voor mij werkte op macOS. Dit komt omdat het een oudere versie van bash heeft (denk ik). De minder elegante '2> en 1 |' werkt prima - Danny Parker
hoe zit het met n, y, y, y? - user1133275
@Jas om zowel stderr (2) als stdout (1) streams om te leiden. - Byte Commander


Je kan ook gebruiken tee om de uitvoer naar een bestand te verzenden:

command | tee ~/outputfile.txt

Een kleine aanpassing zal stderr ook vangen:

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

of iets korter en minder gecompliceerd:

command |& tee ~/outputfile.txt

tee is handig als je dat wilt de opdrachtuitvoer vastleggen terwijl u deze ook live bekijkt.


81
2018-06-20 04:45



tee is handig als u de opdrachtuitvoer wilt kunnen vastleggen terwijl u deze ook live bekijkt. Maak deze regel stoutmoedig Aaron. Het zal twee taken tegelijkertijd doen. Bedankt voor het antwoord. - learner
Er staat dat & het onverwacht is en het log niet op hetzelfde moment schrijft als de opdracht wordt uitgevoerd. Ik gebruik dit in een bash-bestand echter, maakt dat enig verschil? - tim687
@ tim687 Ik heb die bewerking verwijderd. Sorry daarvoor ... was geen deel van mijn oorspronkelijke antwoord. - Aaron
@Aaron Bedankt! tee zal het bestand in realtime toevoegen, toch? Ik heb een back-upscript dat ik gebruik, lol, een back-up maken van mijn pc, maar het loggen gebeurt niet in realtime. Mijn pc gaat in slaap nadat de back-up is voltooid en het logbestand leeg is. Moet ik een ander commando gebruiken om de commando's te loggen? - tim687
miljard bedankt bro - Mahesha999


U kunt de uitvoer van de opdracht omleiden naar een bestand:

your_command >/path/to/file

Als u de opdrachtuitvoer aan een bestand wilt toevoegen in plaats van het te overschrijven, gebruikt u:

your_command >>/path/to/file

17
2018-02-14 19:52



Hartelijk bedankt ! zijn er limieten? zoals de maximale grootte van het bestand? - led-Zepp
De maximale bestandsgrootte wordt slechts beperkt door het bestandssysteem - chaos
Dit antwoord zal stderr niet redden. Gebruik &>, zie stackoverflow.com/questions/637827/... en tldp.org/LDP/abs/html/io-redirection.html - Panther
Het OP heeft nooit gevraagd om stderr op te slaan - chaos


Een verbetering om te overwegen -

Verschillende scripts injecteren kleurcodes in de uitvoer die u misschien niet wilt overbevolken met uw logbestand.

Om dit te verhelpen, kunt u het programma gebruiken sed om die codes eruit te halen. Voorbeeld:

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



Hoe de output op te slaan op een manier dat kleuren worden bewaard? Ik zou graag het resultaat van een commando in libreoffice importeren en de kleuren behouden. - madrang
@madrang: Ik heb je reactie nu alleen gelezen, maar mogelijk vind je dit antwoord nuttig. - Sylvain Pineau
Oh, bijna precies wat ik zoek. Hoe print ik ook de output op het scherm? - Sigur
Merk op dat veel opdrachten die ingekleurde uitvoer produceren, zoals ls en grep, ondersteuning --color=auto, die alleen kleurcodes uitvoert als standaarduitvoer een terminal is. - Eliah Kagan


Voor cron banen enz. wilt u de Bash-extensies vermijden. Het equivalent POSIX sh omleidingsoperatoren zijn

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

U zult merken dat de POSIX-faciliteit in zekere zin eenvoudiger en rechtlijniger is. De &> syntaxis is geleend van csh wat je al zou moeten overtuigen dat het een slecht idee is.


1
2018-04-11 12:25





some_command | tee command.log en some_command > command.log hebben het probleem dat ze de uitvoer van de opdracht niet opslaan in de command.log bestand in realtime.

Om dat probleem te voorkomen en de opdrachtuitgang in realtime op te slaan, kunt u toevoegen unbuffer, die met de komt expect pakket.


Voorbeeld:

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

Ervan uitgaand log.py bevat:

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

je kan lopen unbuffer python log.py | tee command.log of unbuffer python log.py > command.log

Meer informatie: Hoe kan ik in realtime een opdrachtuitgang naar een bestand opslaan?


0
2017-07-04 20:54



Ze slaan de uitvoer op zoals ze deze ontvangen, het probleem is dat python buffering inschakelt wanneer de uitvoer niet naar een TTY is. Andere opties om dit in Python uit te schakelen: stackoverflow.com/q/107705/2072269 - muru