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 &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. Co rozumiesz przez już skonfigurowany deskryptor pliku? Co to oznacza prawo?Jedną z sytuacji, kiedy jest to potrzebne, jest wyświetlenie
strace
wyniku w pager.strace
wypisuje swoje wyjście na standardowy błąd, a potoki zazwyczaj łączą standardowe wyjście ze standardowym wejściem, więc musisz użyć przekierowania:źródło
pipes generally connect standard output to standard input
?|
) pobiera standardowe wyjście pierwszego polecenia i łączy je ze standardowym wejściem drugiego polecenia.Czasami chcesz przekierować zarówno
stdout
(1
), jak istderr
(2
) do tej samej lokalizacji (/dev/null
na przykład). Jednym ze sposobów osiągnięcia tego byłoby:Ale większość ludzi to skrócić poprzez przekierowanie
stderr
dostdout
z2>&1
:Jeszcze krótsza wersja to:
źródło
2: To jest, kiedy będziesz miał wyjście zarówno ze standardowego błędu, jak i ze standardowego wyjścia, i chcesz, aby były one złożone w jeden ciąg.
1: Gdy chcesz manipulować wyjściem zarówno standardowego błędu, jak i standardowego wyjścia.
źródło
>2
jest wysyłane do / dev / null. A może całkowicie źle to zrozumiałem?Używam go, aby rozpocząć odłączoną pracę:
wtedy mogę się wylogować, a niektóre programy będą nadal działać. Funkcjonalność zapewnia GNU Screen, tmux i niektóre inne programy - ale tutaj jest to osiągane bez żadnych zewnętrznych zależności.
źródło
nohup
lubdisown
w takich przypadkach.Wyobraź sobie, że istnieje katalog o
try
tych trzech plikach:file file1 and file2.
Teraz uruchom to polecenie:
Pierwsze trzy pliki są otwarte, ale
cat
zgłasza błąd podczas otwierania czwartego, ponieważ nie istnieje.Teraz uruchom:
Nie widzę żadnego wyjścia na ekranie: Po pierwsze
1>outfile
będzie przekierowywać wyjście polecenieoutfile
, a następnie nastąpi przekierowanie (2>&1
) błąd rzucony podczas próby otwarciafile3
sięoutfile
.1>&2
działa podobnie i przekierowuje strumień błędów na standardowe wyjście.Mam nadzieję że to pomoże!
źródło
Użyj
tty
polecenia w każdym terminalu, aby je zidentyfikować:Zakładając te TTY, aby przekierować stdout pierwszego na drugi, uruchom to w pierwszym terminalu:
Aby przywrócić domyślne zachowanie standardowego punktu pts / 0:
Obejrzyj ten film, aby zobaczyć demonstrację.
źródło
Omówiono już przypadek przekierowania stderr na stdout (np. Użyj go do filtrowania komunikatów o błędach (grep)).
Drugi przypadek to przekierowanie stdout na stderr. Częstym przypadkiem (przynajmniej dla mnie) jest wysyłanie ostrzeżeń / komunikatów o błędach wydrukowanych za pomocą „echa” (w moich skryptach powłoki) do stderr (aby łatwiej mogli zwrócić uwagę użytkownika).
Na przykład,
źródło