Kommentarer
- For dem der ender her fra Google, kan du også overveje dette svar ( unix.stackexchange.com/a/164017/103505 ) for bare at sætte al koden du vil output i en funktion i scriptet og derefter omdirigere output for den funktion.
Svar
En metode, jeg fandt til at fange al output fra enhver session, er at starte en ny bash-session og tee til en logfil. det er virkelig nyttigt til sporing af mere end bare et 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
eller du kan bare tee scriptet, det er selv
./myscript.sh | tee ./myscript.log #this will log only the output of the script.
Kommentarer
Svar
Du kan altid påberåbe script
inde i et script til log alt.
Hvad angår udskrivning og logning af alt på samme tid i et bash-script til log.txt
:
Se loggen 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
Kommentarer
- Hvis jeg forstår det rigtigt (nogle forklaringer kan hjælpe :), prøver scriptet at opdage, om det ' kører under
script
, og udfør ikke selv igen. Fra og med Ubuntu 20 ser det ud til, at$SCRIPT
ikke er indstillet, så scriptet går i en uendelig løkke. - God idé at bruge
script
dog, fordi det giver mulighed for interaktiv terminaloutput, f.eks Vognretur, til arbejde. Faktisk opfører kommandoer, der viser fremgangsoutput med en linje (f.eks. Arkiver), normalt . Hvad angår løsningen af det uendelige løkkeproblem, kan vi teste shell-niveauet :if (( $SHLVL < 3 )); then script...; fi
. - Også scripts argumenterne ender med at blive sammenkædet og videregivet i kode argumentet til skallen startet af
script
(ikke/bin/bash
, at/bin/bash
argument ignoreres med util-linuxscript
)
Svar
Du vil bruge tee .
Eks:
echo "Hello World" | tee out.txt
Dette opretter en fil out.txt med output fra kommandoen og udskriver den til skærmen. Brug “tee -a filnavn”, hvis du vil føje til filen.
echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt
out.txt vil have to linjer Hello and World (uden -a det ville kun have verden)
Hvis du vil gemme hele scriptet og outputte hele scriptet:
./script.sh | tee output.txt
Kommentarer
- Din løsning adresserer STDOUT, men ikke STDERR
- unix.stackexchange.com/a/61932/268823 forklarer, hvordan man gør STDOUT og STDERR
- Jeg tror ikke ' tror ikke dette svarer på spørgsmålet, fordi krav nr. 1 var " kør ./myscript.sh uden yderligere shell-konstruktioner ".
- Jeg tror en måde at gøre det på ville være at sætte alt i en funktion og bruge tee i slutningen. Det ville effektivt fungere som en start og stop capture. Og omdirigere STDERR, hvis det er hensigten.
2>&1
>
output i stedet for tee, og det er derfor, jeg delte muligheden for tee.