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$SCRIPTikke er satt, så skriptet går i en uendelig løkke. - God idé å bruke
scriptskjø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/bashargument 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.