Če želim v lupini Unix združiti stderr
in stdout
v tok stdout
za nadaljnjo manipulacijo, lahko na koncu ukaza dodam naslednje:
2>&1
Če torej želim uporabiti head
na izhodu iz g++
, lahko naredim nekaj takega:
g++ lots_of_errors 2>&1 | head
tako da lahko vidim le prvih nekaj napak.
Vedno imam težave s pomnjenjem tega in ga moram nenehno iskati, predvsem zato, ker ne razumem v celoti sintakse tega posebnega trika.
Ali lahko kdo to razčleni in znak za znakom razloži, kaj pomeni 2>&1
?
Datotečni deskriptor 1 je standardni izhod (stdout
).
Datotečni deskriptor 2 je standardna napaka (stderr
).
Tukaj je eden od načinov, kako si zapomniti to konstrukcijo (čeprav ni povsem natančen): na začetku je 2>1
morda videti kot dober način za preusmeritev stderr
na stdout
. Vendar se bo dejansko interpretirala kot "preusmeritev stderr
v datoteko z imenom 1
". &
označuje, da je to, kar sledi, deskriptor datoteke in ne ime datoteke. Tako postane konstrukcija: 2>&1
.
echo test > afile.txt
preusmeri stdout na afile.txt
. To je enako, kot če bi naredili
echo test 1> afile.txt
Če želite preusmeriti stderr, naredite:
echo test 2> afile.txt
>&
je sintaksa za preusmeritev toka na drug datotečni deskriptor - 0 je stdin, 1 je stdout in 2 je stderr.
Tok stdout lahko preusmerite na stderr tako, da:
echo test 1>&2 # or echo test >&2
ali obratno:
echo test 2>&1
Torej, na kratko... 2>
preusmeri stderr v (neopredeljeno) datoteko, dodajanje &1
pa preusmeri stderr na stdout.
Številke se nanašajo na deskriptorje datotek (fd).
stdin
stdout
2>&1
preusmeri fd 2 na 1.
To deluje za poljubno število deskriptorjev datotek, če jih program uporablja.
Če ste jih pozabili, lahko pogledate v /usr/include/unistd.h
:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Povedal sem, da sem napisal orodja v jeziku C, ki uporabljajo nestandardne datotečne deskriptorje za beleženje po meri, tako da ga ne vidite, razen če ga preusmerite v datoteko ali kaj podobnega.