Hvis jeg i en Unix-shell ønsker at kombinere stderr
og stdout
i stdout
-strømmen til yderligere manipulation, kan jeg tilføje følgende i slutningen af min kommando:
2>&1
Så hvis jeg ønsker at bruge head
på output fra g++
, kan jeg gøre noget i stil med dette:
g++ lots_of_errors 2>&1 | head
så jeg kun kan se de første få fejl.
Jeg har altid problemer med at huske dette, og jeg er konstant nødt til at slå det op, og det er hovedsageligt fordi jeg ikke helt forstår syntaksen for dette særlige trick.
Kan nogen bryde det op og forklare tegn for tegn, hvad 2>&1
betyder?
Fildescriptor 1 er standardudgangen (stdout
).
Fildescriptor 2 er standardfejl (stderr
).
Her er en måde at huske denne konstruktion på (selvom den ikke er helt præcis): ved første øjekast kan 2>1
se ud som en god måde at omdirigere stderr
til stdout
. Men det vil faktisk blive fortolket som "redirect stderr
til en fil med navnet 1
". &
angiver, at det følgende er en fildeskriptor og ikke et filnavn. Så konstruktionen bliver: 2>&1`.
echo test > afile.txt
omdirigerer stdout til afile.txt
. Dette er det samme som at gøre
echo test 1> afile.txt
For at omdirigere stderr, gør du:
echo test 2> afile.txt
>&
er syntaksen til at omdirigere en strøm til en anden fildeskriptor - 0 er stdin, 1 er stdout og 2 er stderr.
Du kan omdirigere stdout til stderr ved at gøre:
echo test 1>&2 # or echo test >&2
Eller omvendt:
echo test 2>&1
Så, kort sagt... 2>
omdirigerer stderr til en (uspecificeret) fil, ved at tilføje &1
omdirigerer stderr til stdout.
Numrene henviser til fildeskriptorerne (fd).
stdin
.stdout
.stderr
.2>&1
omdirigerer fd 2 til 1.
Dette virker for et hvilket som helst antal fildeskriptorer, hvis programmet bruger dem.
Du kan kigge i /usr/include/unistd.h
, hvis du glemmer dem:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Når det er sagt, har jeg skrevet C-værktøjer, der bruger ikke-standardiserede fildeskriptorer til brugerdefineret logning, så du ikke kan se det, medmindre du omdirigerer det til en fil eller noget.