Zachyťte veškerý výstup skriptu do souboru (ze samotného skriptu) [duplikát]

Tato otázka již má odpovědi zde :

Komentáře

  • Pro ty, kteří zde skončí na Googlu, můžete také zvážit tuto odpověď ( unix.stackexchange.com/a/164017/103505 ), abyste vložili celý kód chcete výstup ve funkci ve skriptu a poté přesměrovat výstup této funkce.

Odpovědět

Metoda, kterou jsem našel, aby zachytil veškerý výstup z jakékoli relace, je zahájit novou relaci bash a tee do souboru protokolu. je to opravdu užitečné pro sledování více než jen skriptu.

 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 

nebo můžete skript jednoduše vypálit

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Komentáře

  • Vaše řešení řeší STDOUT, ale ne STDERR
  • Uvádím příklad s 2>&1
  • Nemyslím si ' že to odpovídá na otázku, protože požadavek # 1 byl " spuštěn ./myscript.sh bez dalších konstrukcí shellu ".
  • Tato otázka byla upravena před 6 hodinami, neudělal jsem ' Nemám tyto informace, když jsem poprvé odpověděl na otázku. Místo tee používal výstup >, a proto jsem sdílel možnost pro tee.

Odpověď

Vždy můžete vyvolat script uvnitř skriptu na zaznamenat vše.

Pokud chcete vytisknout a zaznamenat vše současně v bash skriptu na log.txt:

Zobrazení protokolu 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 

Komentáře

  • Pokud správně rozumím (některá vysvětlení by pomohla :), skript se pokouší zjistit, zda ' běží pod script a znovu se nespustit. Od verze Ubuntu 20 to vypadá, že $SCRIPT není nastaven, takže skript přejde do nekonečné smyčky.
  • Dobrý nápad použít script protože umožňuje interaktivní výstup terminálu, např Carriage Return, do práce. Ve skutečnosti se příkazy, které zobrazují jednořádkový postup průběhu (například archivátory), chovají normálně . Pokud jde o řešení problému nekonečné smyčky, můžeme otestovat úroveň shellu : if (( $SHLVL < 3 )); then script...; fi.
  • Argumenty skriptů také skončí zřetězením a předáním v argumentu code do shellu spuštěného script (ne /bin/bash, tento argument /bin/bash je pomocí util-linux script)

Odpověď

Chcete použít tričko .

Příklad:

echo "Hello World" | tee out.txt 

Tím se vytvoří soubor out.txt s výstupem z příkazu a vytiskne se na obrazovku. Pokud chcete soubor přidat, použijte „tee -a název souboru“.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt bude mít dva řádky Hello a World (bez -a it bude mít pouze svět)

Pokud chcete uložit celý skript a vygenerovat celý skript:

./script.sh | tee output.txt 

Komentáře

  • Vaše řešení řeší STDOUT, ale ne STDERR
  • unix.stackexchange.com/a/61932/268823 vysvětluje, jak dělat STDOUT a STDERR
  • Nemyslím si ' že to neodpovídá na otázku, protože požadavek # 1 byl " spustit ./myscript.sh bez dalších konstrukcí shellu ".
  • Myslím, že jedním ze způsobů, jak to udělat, by bylo dát vše do funkce a na konci použít tričko. To by efektivně fungovalo jako start a stop zachycení. A přesměrování STDERR, pokud je to záměr.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *