Odpowiedzi:
&
W 2>&1
po prostu mówi, że liczba 1
jest deskryptor pliku, a nie nazwa pliku. W tym przypadku standard output file descriptor
.
Jeśli użyjesz 2>1
, przekieruje to błędy do pliku o nazwie, 1
ale jeśli użyjesz 2>&1
, wyśle to do standard output stream
.
To oznacza, &>
że wyślij oba standard output
i standard error
gdzieś. Na przykład ls <non-existent_file> &> out.file
. Pozwól, że zilustruję to przykładem.
Ustawiać:
Utwórz plik koko
o następującej treści:
#!bin/bash
ls j1
echo "koko2"
Spraw, by był wykonywalny: chmod u+x koko
Teraz zauważ, że j1
nie istnieje
Teraz biegnij ./koko &> output
biegnij, cat output
a zobaczysz
ls: cannot access 'j1': No such file or directory
koko2
Zarówno standard error
( ls: cannot access 'j1': No such file or directory
), jak i standard output
( koko2
) zostały wysłane do pliku output
.
Teraz uruchom go ponownie, ale tym razem tak:
./koko > output
Zrób, cat output
a zobaczysz tylko koko2
podobne. Ale nie błąd wyjściowy z ls j1
polecenia. Zostanie on wysłany do tego, standard error
co zobaczysz w swoim terminalu.
Ważna uwaga dzięki @Byte Commander:
Pamiętaj, że command >file 2>&1
kolejność przekierowań jest ważna. Jeśli command 2>&1 >file
zamiast tego napiszesz (co zwykle nie jest tym, czego chcesz), najpierw przekieruje polecenie stdout
do pliku, a następnie przekieruje polecenie stderr
do teraz nieużywanego stdout
, więc pojawi się w terminalu i możesz potokować go lub przekierować ponownie, ale nie zostanie zapisany w pliku.
command >file 2>&1
kolejność przekierowań jest ważna. Jeśli command 2>&1 >file
zamiast tego napiszesz (co zwykle nie jest tym, czego chcesz), najpierw przekieruje stdout polecenia do pliku, a następnie przekieruje stderr polecenia na teraz nieużywany stdout, więc pokaże się w terminalu i możesz go potokować lub przekieruj go ponownie, ale nie zostanie zapisany w pliku.
standard output
co zobaczysz w swoim terminalu”. nie powinno to być „dla standard error
”?
> FILE 2>&1
i &> FILE
są równoważne. Patrz 8.2.3.2. Przekierowanie błędów w Bash Guide dla początkujących Rozdział 8
&> FILE
jest specyficzny tylko dla Bash, podczas gdy >FILE 2>&1
jest rozumiany przez większą liczbę powłok.
[n]>&word
Nazywa powielania wyjściowego pliku deskryptora (patrz punkt 2.7.6 z POSIX Shell Język standardu). To szczególne zachowanie funkcji Bourne jak powłoki, w tym ksh
, dash
oraz bash
; w rzeczywistości standard opiera się na powłoce Bourne'a i ksh
. Patrząc na tcsh podręczniki i csh , najwyraźniej nie zapewniają one możliwości kopiowania żadnego deskryptora pliku, jednak z opisu >&
, zachowuje się jak &>
w bash
(to znaczy przekierowuje błędy i normalne wyjście do pliku).
W systemach * nix, w tym Ubuntu, często słyszysz, że wszystko jest w formie pliku, a raczej deskryptorem pliku . Standardowym wyjściem jest stały deskryptor pliku 1, a standardowym błędem jest deskryptor pliku 2. Tak więc > FILE 2>&1
technicznie oznacza duplikowanie deskryptora pliku 2 na deskryptorze pliku 1. Innymi słowy tej odpowiedzi :
2> i 1 nakazuje powłoce nadanie komendzie deskryptora pliku 2, który jest duplikatem deskryptora 1. (tzn. Stderr i stdout wskazują na to samo fd).
Kluczem tutaj jest zauważyć, że deskryptor 1 musi być ustawiony jako pierwszy. Ponieważ powłoka przetwarza przekierowania w kolejności od lewej do prawej,command >FILE 2>&1
mówi powłoce, aby przełączyła standardowe wyjście, command
aby przejść do FILE
pierwszej, a dopiero potem deskryptor 2 może stać się kopią 1, to znaczy 1 i 2 wskazują tę samą lokalizację - FILE
.
To oczywiście wykracza poza standardowy błąd i standardowe wyjście. Jak pokazano w tej odpowiedzi , robiąc3&>2
... duplikujesz (dup2) filedescritor 2 na filedescriptor 3, ewentualnie zamykając filedescriptor 3, jeśli jest już otwarty
Przykładem manipulacji deskryptorami plików, wśród wielu, byłoby przechwytywanie danych wyjściowychdialog
polecenia w zmiennej
Warto również zauważyć, że &>
jest to specyficzne dla bash
. W zsh
tym zachowuje się tak samo, ale zgodnie z dokumentacją „... nie ma takiego samego efektu jak„> słowo 2> i 1 ”w obecności multios”. W zgodności z POSIX /bin/sh
byłoby to traktowane jako zwykłe przekierowanie z umieszczeniem polecenia w tle. Zobacz też, Czy istnieje kod sh, który nie jest poprawnym składniowo kodem bash? .
Zobacz też:
&>
znaczy