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
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-linuxscript
)
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.
2>&1
>
-uitvoer in plaats van tee en daarom deelde ik de optie voor tee.