it-swarm-eu.dev

Rozdíl mezi 2> & 1> output.log a 2> & 1 | tee output.log

Chtěl jsem vědět rozdíl mezi následujícími dvěma příkazy

2>&1 > output.log 

a

2>&1 | tee output.log

Viděl jsem, jak jeden z mých kolegů přesměroval druhou možnost. Vím, co 2> & 1 dělá, moje jediná otázka je, jaký je účel použití odpaliště, kde lze použít jednoduché přesměrování ">" operátora?

36

Při pohledu na oba příkazy samostatně:

utility 2>&1 >output.log 

Zde, protože přesměrování jsou zpracovávána zleva doprava, standardní chybový tok by byl nejprve přesměrován kamkoli standardní výstupní tok (možná na konzoli), a pak standardní výstupní tok by byl přesměrován do souboru. Standardní tok chyb by byl ne přesměrován na tento soubor.

Viditelným efektem by bylo, že získáte to, co je na standardní chybě na obrazovce a co je produkováno na standardním výstupu v souboru.

utility 2>&1 | tee output.log

Zde přesměrujete standardní chybu na stejné místo jako standardní výstupní proud. To znamená, že oba proudy budou převedeny do obslužného programu tee jako jediný smíchaný výstupní tok a tato standardní výstupní data budou uložena do daného souboru pomocí tee. Data by navíc byla reprodukována pomocí tee v konzole (to je to, co dělá tee, duplikuje datové toky).

Kterýkoli z nich se používá, záleží na tom, čeho chcete dosáhnout.

Všimněte si, že byste nemohli reprodukovat účinek druhého potrubí pouze pomocí > (Jako v utility >output.log 2>&1), Což by uložilo standardní výstup i chybu v souboru prvním přesměrováním standardního výstupu na soubor output.log a poté přesměruje standardní chybu na místo, kam se standardní výstup nyní dostává). K získání dat v konzole i ve výstupním souboru byste museli použít tee.


Další poznámky:

viditelný účinek prvního příkazu,

utility 2>&1 >output.log 

by bylo stejné jako

utility >output.log

Tj. Standardní výstup jde do souboru a standardní chyba jde do konzoly.

Pokud by byl na konec každého z výše uvedených příkazů přidán další krok zpracování, byl by velký rozdíl:

utility 2>&1 >output.log | more_stuff

utility >output.log      | more_stuff

V prvním potrubí by more_stuff Získalo to, co je původně standardní chybový tok z utility jako jeho standardní vstupní data, zatímco ve druhém potrubí, protože je to pouze výsledný standardní výstupní proud, který je kdy odeslán přes potrubí by část more_stuff potrubí neměla na standardním vstupu co číst.

15
Kusalananda

Redakční poznámka

Nezapomeňte si přečíst komentáře k této odpovědi - derobert .


Původní odpověď

2>&1 >output.log znamená nejprve začít posílat všechny popisovače souboru 2 věci (standardní chyba) na popisovač souboru 1 (standardní výstup) a poté odeslat to do souboru output.log. Jinými slovy, pošlete standardní chybu a standardní výstup do souboru protokolu.

2>&1 | tee output.log je stejné jako u 2>&1 bit, kombinuje standardní výstup a standardní chybu na standardní výstupní proud. Pak potrubím, které prostřednictvím programu tee pošle svůj standardní vstup na svůj standardní výstup (jako cat) a také do souboru. Kombinuje tedy dva proudy (chyba a výstup) a poté je vysílá na terminál a do souboru.

Spodní řádek je, že první odešle stderr/stdout do souboru, zatímco druhý odešle jak souboru, tak standardnímu výstupu ( což je pravděpodobně terminál, pokud nejste uvnitř jiného konstruktu, který má přesměrovaný standardní výstup).

Tuto poslední možnost zmiňuji, protože můžete mít věci jako:

(echo hello | tee xyzzy.txt) >plugh.txt

kde na terminálu nic nekončí.

24
user14408

První příkaz provede další úkol:

Po

2>&1 > output.log 

starý STDOUT bude uložen (zkopírován) do STDERR a potom bude STDOUT přesměrován do souboru.

Takže stdout půjde do souboru a stderr půjde do konzole.

A v

 2>&1 | tee output.log

oba proudy budou přesměrovány na odpaliště. Tee duplikuje jakýkoli vstup do svého stdout (konzole ve vašem případě) a do souboru (output.log).

A existuje i první forma:

    > output.log  2>&1

toto přesměruje STDOUT i STDERR do souboru.

8
osgx

Bývalý výstup pouze do souboru. Druhý výstup jak do souboru a na obrazovku.

4
André Caron

Důvod pro 2>&1 | tee má být schopen zachytit stdout i stderr do souboru protokolu a zobrazit jej současně na obrazovce. To lze provést jako >output.txt 2>&1 & tail -f také, ale nevíte, kdy bude příkaz na pozadí ukončen - je program ukončen nebo běží bez výstupu. The 2>&1 | tee byl pro programátory běžným idiomem.

4
Arcege

Nejprve uvidíme ukázkový kód:

#include <stdio.h>
main() 
{
// message 1, on stdout (using  printf)
printf("%s",          "message 1, on stdout (using  printf)\n");

// message 2, on stdout (using fprintf)
fprintf(stdout, "%s", "message 2, on stdout (using fprintf)\n");

// message 3, on stderr (using fprintf)
fprintf(stderr, "%s", "message 3, on stderr (using fprintf)\n");
}

možňuje porovnat výsledky:
./helloerror
+ soubor: žádná zpráva; konzole: zpráva 1,2,3;

./helloerror >error.txt
+ soubor: zpráva 1,2; konzole: zpráva 3;

./helloerror 2>&1 >error.txt
+ soubor: zpráva 1,2; konzole: zpráva 3;
+ stejné jako ./helloerror> error.txt

./helloerror >error.txt 2>&1
+ soubor: zpráva 3,1,2; konzole: žádná zpráva;
+ Všimněte si, že pořadí 3 je nejprve, pak 1, pak 2

./helloerror | tee error.txt 2>&1
+ soubor: zpráva 1,2; konzole: zpráva 3,1,2;
+ Všimněte si, že pořadí 3 je nejprve, pak 1, pak 2

./helloerror 2>&1 | tee error.txt
+ soubor: zpráva 3,1,2; konzole: zpráva 3,1,2;

Použít:
./helloerror >error.txt 2>&1
-> pokud někdo chce všechny (stdout + stderr) zprávy v souboru, ale není připnutý na konzoli

./helloerror 2>&1 | tee error.txt
-> pokud někdo chce všechny (stdout + stderr) zprávy v souboru a vytištěné na konzole

0
Hari Perev