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
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-linuxscript
)
ignorován div>
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.
2>&1
>
, a proto jsem sdílel možnost pro tee.