Czasami chcesz przekierować zarówno stdout, jak i stderr do tej samej lokalizacji. To >&jest używane - wskazuje jeden deskryptor pliku na inny.
Na przykład, jeśli chcesz zapisać stdout i stderr do tego samego pliku (czy to /dev/nulllub output.txt), możesz przekierować je osobno, za pomocą
app 1>/dev/null 2>/dev/null
lub możesz przekierować jeden deskryptor pliku do pliku, a drugi deskryptor pliku do pierwszego:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
W pierwszym przykładzie 2>&1wskazuje deskryptor pliku nr 2 w miejsce, w którym numer 1 już wskazuje. Drugi przykład osiąga to samo, zaczynając od stderr zamiast tego.
Jako kolejny przykład zdarzają się przypadki, gdy stdout (deskryptor pliku # 1) wskazuje już żądaną lokalizację, ale nie można odwoływać się do niej po nazwie (może to być związane z potokiem, gniazdem itp.). Zdarza się to często, gdy używa się rozszerzenia procesu ( ` `lub $( )operatorów), które zwykle przechwytuje tylko standardowe wyjście, ale możesz chcieć uwzględnić w nim standard. W takim przypadku użyłbyś również >&do wskazania stderr na stdout:
out=$(app 2>&1)
Innym częstym przykładem jest pager greplub podobne narzędzie, ponieważ rura |zwykle działa tylko na stdout, przed użyciem potoku przekierujesz stderr na stdout:
app 2>&1 | grep hello
Jak wiemy, które z 2>&1lub 1>&2jest poprawna? Już skonfigurować deskryptor idzie z prawej strony >&, a deskryptor pliku, który chcesz przekierować idzie w lewo. ( 2>&1oznacza „wskaż deskryptor pliku nr 2 na deskryptor pliku nr 1”).
Niektóre powłoki mają skróty do typowych przekierowań; oto przykłady z Bash:
1> można skrócić do just >
1>foo 2>&1do >&foolub&>foo
2>&1 | program do |& program
app 1>/dev/null 2>&1tego oznaczałoby, że 2> i 1 wskazywałyby na plik, do którego 1 już przekierowywał. Rozumiem, że mógłbym równie łatwo zrobićapp > /dev/null &>?