Požadovaný příkaz se jmenuje tee
:
foo | tee output.file
Pokud vás například zajímá pouze stdout:
ls -a | tee output.file
Pokud chcete zahrnout stderr, postupujte takto:
program [arguments...] 2>&1 | tee outfile
2>&1
přesměruje kanál 2 (stderr/standardní chyba) do kanálu 1 (stdout/standardní výstup), takže oba jsou zapsány jako stdout. Od tee
je také směrován na daný výstupní soubor příkaz.
Navíc, pokud chcete připojit k souboru protokolu použijte tee -a
jako:
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
vypíše proudy stderr a stdout.tee outfile
vezme proud, který získá, a zapíše jej na obrazovku a do souboru "outfile".
To je pravděpodobně to, co většina lidí hledá. Pravděpodobná situace je, že nějaký program nebo skript tvrdě pracuje po dlouhou dobu a produkuje velké množství výstupu. Uživatel chce pravidelně kontrolovat průběh, ale také chce, aby byl výstup zapsán do souboru.
Problém (zejména při směšování proudů stdout a stderr) je v tom, že je spolehnutí na to, že proudy budou vyplachovány programem. Pokud jsou například všechny zápisy do stdout ne vyprázdněno, ale všechny zápisy do stderr jsou vyprázdněny, pak skončí mimo chronologické pořadí ve výstupním souboru a na obrazovce.
Je také špatné, pokud program každých pár minut vydá pouze 1 nebo 2 řádky, aby hlásil pokrok. V takovém případě, pokud by výstup nebyl vyprázdněn programem, uživatel by ani neviděl žádný výstup na obrazovce po dobu několika hodin, protože žádný z nich by nebyl protlačen potrubím po dobu několika hodin.
Aktualizace:Program unbuffer
, součást expect
balíček, vyřeší problém s ukládáním do vyrovnávací paměti. To způsobí, že stdout a stderr okamžitě zapíší na obrazovku a soubor a udrží je synchronizované, když jsou zkombinovány a přesměrovány na tee
. Např.:
$ unbuffer program [arguments...] 2>&1 | tee outfile
Další způsob, který mi vyhovuje, je
<command> |& tee <outputFile>
jak je uvedeno v příručce gnu bash
Příklad:
ls |& tee files.txt
Pokud je použit znak „|&“, standardní chyba příkazu1 , kromě jeho standardního výstupu , je připojen ke standardnímu vstupu command2 přes potrubí; je to zkratka pro 2>&1 |. Toto implicitní přesměrování standardní chyby na standardní výstup se provede po jakémkoli přesměrování zadaném příkazem.
Další informace naleznete v přesměrování