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?

Løsning

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`.

Kommentarer (18)
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.

Kommentarer (5)

Numrene henviser til fildeskriptorerne (fd).

  • Nul er stdin.
  • Et er stdout.
  • To er 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.

Kommentarer (0)