Leg alle uitvoer van een script vast in een bestand (van het script zelf) [duplicate]

Deze vraag heeft hier al antwoorden :

Reacties

  • Voor degenen die hier van Google terechtkomen, kunt u ook dit antwoord overwegen ( unix.stackexchange.com/a/164017/103505 ) om gewoon alle code in te voeren je wilt een functie in het script uitvoeren en vervolgens de uitvoer van die functie omleiden.

Answer

Een methode die ik heb gevonden om alle output van elke sessie vast te leggen, is door een nieuwe bash-sessie te starten en naar een logbestand te gaan. het is echt handig voor het volgen van meer dan alleen een script.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

of je kunt gewoon het script zelf schrijven

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Reacties

  • Je oplossing adresseert STDOUT, maar niet STDERR
  • Ik heb een voorbeeld gegeven met 2>&1
  • Ik denk niet dat ' dit de vraag beantwoordt omdat vereiste # 1 " werd uitgevoerd ./myscript.sh zonder aanvullende shell-constructies ".
  • Deze vraag is 6 uur geleden bewerkt, ik heb ' beschikte niet over die informatie toen ik de vraag voor het eerst beantwoordde. Het gebruikte > -uitvoer in plaats van tee en daarom deelde ik de optie voor tee.

Antwoord

Je kunt altijd script binnen een script aanroepen om alles loggen.

Om alles tegelijkertijd af te drukken en te loggen in een bash-script naar log.txt:

Het logboek zien log.txt:

$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

Reacties

  • Als ik het goed begrijp (sommige uitleg zou helpen :), probeert het script te detecteren of het ' draait onder script, en voert zichzelf niet opnieuw uit. Vanaf Ubuntu 20 lijkt het erop dat $SCRIPT niet is ingesteld, dus het script gaat in een oneindige lus.
  • Goed idee om echter, omdat het interactieve terminaluitvoer mogelijk maakt, bijv Koets terug, aan het werk. In feite gedragen commandos die voortgangsuitvoer van één regel weergeven (archiveringsprogrammas bijvoorbeeld), , gedragen zich normaal . Wat betreft het oplossen van het oneindige lusprobleem, kunnen we het shell-niveau testen : if (( $SHLVL < 3 )); then script...; fi.
  • Ook worden de argumenten van de scripts samengevoegd en in het code -argument doorgegeven aan de shell die is gestart door script (niet /bin/bash, dat /bin/bash argument wordt genegeerd met util-linux script)

Answer

U wilt tee gebruiken.

Bijv .:

echo "Hello World" | tee out.txt 

Dit maakt een bestand out.txt aan met de uitvoer van het commando en drukt het af op het scherm. Gebruik “tee -a filename” als je aan het bestand wilt toevoegen.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt heeft twee regels Hallo en Wereld (zonder -a it zou alleen wereld hebben)

Als je het hele script wilt opslaan en het hele script wilt uitvoeren:

./script.sh | tee output.txt 

Reacties

  • Uw oplossing adresseert STDOUT, maar niet STDERR
  • unix.stackexchange.com/a/61932/268823 legt uit hoe je STDOUT en STDERR moet doen.
  • Ik denk niet dat ' dit de vraag beantwoordt omdat vereiste nr. 1 " voer ./myscript.sh uit zonder aanvullende shell-constructies ".
  • Ik denk dat een manier om het te doen zou zijn om alles in een functie te zetten en aan het einde tee te gebruiken. Dat zou effectief werken als een start en stop het vastleggen. En het omleiden van de STDERR als dat de bedoeling is.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *