Widzę rzeczy takie jak command 1> out
lub z 2>&1
przekierowaniem stderr, ale czasami też widzę &>
sam, itp.
Jaki jest najlepszy sposób na zrozumienie &
i co to dokładnie znaczy?
źródło
Widzę rzeczy takie jak command 1> out
lub z 2>&1
przekierowaniem stderr, ale czasami też widzę &>
sam, itp.
Jaki jest najlepszy sposób na zrozumienie &
i co to dokładnie znaczy?
&
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.
&>
znaczycommand >file 2>&1
kolejność przekierowań jest ważna. Jeślicommand 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ć „dlastandard 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źródło
&> 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 tymksh
,dash
orazbash
; w rzeczywistości standard opiera się na powłoce Bourne'a iksh
. 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&>
wbash
(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 :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ść doFILE
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ąc
3&>2
Przykładem manipulacji deskryptorami plików, wśród wielu, byłoby przechwytywanie danych wyjściowych
dialog
polecenia w zmiennejWarto również zauważyć, że
&>
jest to specyficzne dlabash
. Wzsh
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ż:
źródło