Kommentarer
- För dem som hamnar här från Google kan du också överväga det här svaret ( unix.stackexchange.com/a/164017/103505 ) för att bara lägga in all kod du vill skicka ut en funktion i skriptet och sedan omdirigera utgången för den funktionen.
Svar
En metod som jag hittade för att fånga all produktion från vilken session som helst är att starta en ny bash-session och starta en loggfil. det är verkligen användbart för att spåra mer än bara ett 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 så kan du bara skriva ut skriptet själv
./myscript.sh | tee ./myscript.log #this will log only the output of the script.
Kommentarer
Svar
Du kan alltid anropa script
i ett skript för att logga allt.
Att skriva ut och logga allt samtidigt i ett bash-skript till 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
- Om jag förstår rätt (vissa förklaringar skulle hjälpa 🙂 försöker manuset att upptäcka om det ' körs under
script
, och kör inte själv igen. Från och med Ubuntu 20 ser det ut som att$SCRIPT
inte är inställt, så skriptet går i en oändlig slinga. - Bra idé att använda
script
men eftersom det möjliggör interaktiv terminalutgång, t.ex. Vagnretur, till jobbet. I själva verket beter sig kommandon som visar framstegsutdata med en rad (till exempel arkiverare), normalt . När det gäller att lösa det oändliga loopproblemet kan vi testa skalnivån :if (( $SHLVL < 3 )); then script...; fi
. - Dessutom slutar argumenten för skripten att sammanfogas och skickas i argumentet kod till skalet startat av
script
(inte/bin/bash
, att/bin/bash
argument ignoreras med util-linuxscript
)
Svar
Du vill använda tee .
Ex:
echo "Hello World" | tee out.txt
Detta skapar en fil out.txt med utdata från kommandot och skriver ut på skärmen. Använd ”tee -a filnamn” om du vill lägga till filen.
echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt
out.txt har två rader Hello and World (utan -a det skulle bara ha värld)
Om du vill spara hela skriptet och skicka ut hela skriptet:
./script.sh | tee output.txt
Kommentarer
- Din lösning adresserar STDOUT, men inte STDERR
- unix.stackexchange.com/a/61932/268823 förklarar hur man gör STDOUT och STDERR
- Jag tänker inte ' att detta svarar på frågan eftersom krav nr 1 var " kör ./myscript.sh utan ytterligare skalkonstruktioner ".
- Jag antar att ett sätt att göra det skulle vara att sätta allt i en funktion och använda tee i slutet. Det skulle effektivt fungera som en start och stoppa fångst. Och omdirigera STDERR om det är meningen.
2>&1
>
-output istället för tee och det var därför jag delade alternativet för tee.