Fang all utdataene fra et skript til en fil (fra selve skriptet) [duplikat]

Dette spørsmålet har allerede svar her :

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

  • Løsningen din adresserer STDOUT, men ikke STDERR
  • Jeg la inn et eksempel med 2>&1
  • Jeg tror ikke ' Jeg tror ikke dette svarer på spørsmålet fordi krav nr 1 var " ./myscript.sh uten ytterligere skallkonstruksjoner ".
  • Dette spørsmålet ble redigert for 6 timer siden, jeg gjorde ikke ' t har den informasjonen da jeg først svarte på spørsmålet. Det var å bruke > output i stedet for tee, og det var derfor jeg delte muligheten for tee.

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-linux script)

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *