Hvad betyder " 2>&1 " i skallen?
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?
2112
3
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 omdirigerestderr
tilstdout
. Men det vil faktisk blive fortolket som "redirectstderr
til en fil med navnet1
".&
angiver, at det følgende er en fildeskriptor og ikke et filnavn. Så konstruktionen bliver: 2>&1`.omdirigerer stdout til
afile.txt
. Dette er det samme som at gøreFor at omdirigere stderr, gør du:
>&
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:
Eller omvendt:
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: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.