GNU/Linux >> Znalost Linux >  >> Linux

Jak přesměrovat výstup do souboru a stdout

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í


Linux
  1. Jak přesměrovat výstup programu do souboru ZIP?

  2. Výstup do Stdout a zároveň Grep do souboru?

  3. Jak přesměrovat Stderr a Stdout na různé soubory a také zobrazit v terminálu?

  1. Jaký je rozdíl v přesměrování výstupu pomocí >, &>, >&a 2&>?

  2. Jak přesměrovat stderr a stdout na různé soubory ve stejném řádku ve skriptu?

  3. Přesměrování výstupu příkazu do souboru a terminálu

  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Jak přesměrovat výstup služby systemd do souboru

  3. bash:přesměrování stderr do souboru a stdout + stderr na obrazovku