Fang al output fra et script til en fil (fra selve scriptet) [duplikat]

Dette spørgsmål har allerede svar her :

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

  • Din løsning adresserer STDOUT, men ikke STDERR
  • Jeg har et eksempel med 2>&1
  • Jeg tror ikke ' det synes ikke at svare på spørgsmålet, fordi krav nr. 1 var " ./myscript.sh uden yderligere shell-konstruktioner ".
  • Dette spørgsmål blev redigeret for 6 timer siden, det gjorde jeg ikke ' har ikke disse oplysninger, da jeg første gang besvarede spørgsmålet. Det brugte > output i stedet for tee, og det er derfor, jeg delte muligheden for tee.

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

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *