Kommentarer
- For de som havner her fra Google, kan du også vurdere dette svaret ( unix.stackexchange.com/a/164017/103505 ) for å bare sette all koden du vil sende ut en funksjon i skriptet og omdirigere utdataene til den funksjonen.
Svar
En metode jeg fant for å fange opp all utdata fra en hvilken som helst økt, er å starte en ny bash-økt og tee til en loggfil. det er veldig nyttig for å spore mer enn bare et skript.
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 teppe skriptet det er selv
./myscript.sh | tee ./myscript.log #this will log only the output of the script.
Kommentarer
Svar
Du kan alltid påkalle script
i et skript for å logg alt.
Når det gjelder å skrive ut og logge alt samtidig i et bash-skript til log.txt
:
Ser 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 riktig (noen forklaringer vil hjelpe :), prøver skriptet å oppdage om det ' kjører under
script
, og ikke kjør selv på nytt. Fra og med Ubuntu 20 ser det ut til at$SCRIPT
ikke er satt, så skriptet går i en uendelig løkke. - God idé å bruke
script
skjønt, fordi det gir mulighet for interaktiv terminalutgang, f.eks Vognretur, til jobb. Faktisk oppfører kommandoer som viser fremgangsutgang med én linje (for eksempel arkiver), normalt . Når det gjelder å løse det uendelige løkkeproblemet, kan vi teste skallnivået :if (( $SHLVL < 3 )); then script...; fi
. - Også slutter argumentene til skriptene å bli sammenkoblet og overført i kode argumentet til skallet startet av
script
(ikke/bin/bash
, at/bin/bash
argument ignoreres med util-linuxscript
)
Svar
Du vil bruke tee .
Eks:
echo "Hello World" | tee out.txt
Dette skaper en fil out.txt med utdata fra kommandoen og skriver den ut på skjermen. Bruk «tee -a filnavn» hvis du vil legge til filen.
echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt
out.txt vil ha to linjer Hello and World (uten -a det ville bare ha verden)
Hvis du vil lagre hele skriptet og sende ut hele skriptet:
./script.sh | tee output.txt
Kommentarer
- Løsningen din adresserer STDOUT, men ikke STDERR
- unix.stackexchange.com/a/61932/268823 forklarer hvordan man gjør STDOUT og STDERR
- Jeg tror ikke ' t tror dette svarer på spørsmålet fordi krav nr 1 var " kjør ./myscript.sh uten ytterligere skallkonstruksjoner ".
- Jeg antar at en måte å gjøre det på ville være å sette alt i en funksjon, og bruke tee på slutten. Det ville effektivt fungere som en start og stopp fangst. Og omdirigere STDERR hvis det er intensjonen.
2>&1
>
output i stedet for tee, og det var derfor jeg delte muligheten for tee.