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?
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.
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čí.
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.
Bývalý výstup pouze do souboru. Druhý výstup jak do souboru a na obrazovku.
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.
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