Fånga all utdata från ett skript till en fil (från själva skriptet) [duplicera]

<åt sidan class = "s-meddelande s-meddelande__info js- post-notice mb16 "role =" status ">

Denna fråga har redan svar här :

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

  • Din lösning adresserar STDOUT, men inte STDERR
  • Jag lade ett exempel med 2>&1
  • Jag tror inte ' det här svarar på frågan eftersom krav nr 1 var " ./myscript.sh utan ytterligare skalkonstruktioner ".
  • Den här frågan redigerades för 6 timmar sedan, jag gjorde inte ' har inte den informationen när jag först besvarade frågan. Det använde > -output istället för tee och det var därför jag delade alternativet för tee.

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

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *