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/null
lub 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>&1
wskazuje 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 grep
lub 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>&1
lub 1>&2
jest poprawna? Już skonfigurować deskryptor idzie z prawej strony >&
, a deskryptor pliku, który chcesz przekierować idzie w lewo. ( 2>&1
oznacza „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>&1
do >&foo
lub&>foo
2>&1 | program
do |& program
app 1>/dev/null 2>&1
tego 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 &>
?