Byłem trochę zdezorientowany tym wyrażeniem:
gcc -c -g program.c >& compiler.txt
Wiem, &>filename
że przekieruje zarówno stdout, jak i stderr do pliku filename
. Ale w tym przypadku ampersand znajduje się po znaku większym niż. Wygląda jak jego forma M>&N
, gdzie M
i N
są deskryptory plików.
W powyższym fragmencie, czy M=1
i N='compiler.txt'
? Czym dokładnie się to różni od:
gcc -c -g program.c > compiler.txt (ampersand removed)
Rozumiem, że każdy otwarty plik jest powiązany z deskryptorem pliku większym niż 2. Czy to prawda?
Jeśli tak, to czy nazwa pliku jest wymienna z deskryptorem pliku jako celem przekierowania?
źródło
>&
to składnia używana przez csh i tcsh do przekierowania zarówno stdout, jak i stderr. Prawdopodobnie dlatego bash to akceptuje.&>word
i>word 2>&1
są semantycznie równoważne? Poprzednik „To” nie jest dla mnie jasny.&>word
,>word 2>&1
, i>&word
są dokładnie takie same.>
tylko przekierowania standardowe.>
nie przekierowuje błędu. (Prawdopodobnie powinienem przekierować moje przyszłe komentarze do/dev/null
)&>
vs>&
: preferowana wersja to&>
(clobber)Jeżeli chodzi o:
&>
>&
oba zbiją plik - skracają go do 0 bajtów przed zapisaniem do niego, tak jak
> file
zrobiłoby to w przypadku tylko STDIN.Jednak The
bash
obsługi sekcja przekierowania dodaje, że:(Uwaga: w
zsh
obie są równoważne ).Bardzo dobrą praktyką jest uzyskanie pamięci palca w pierwszej (
&>
) formie, ponieważ:Użyj
&>>
tak, jak>>&
nie jest obsługiwane przezbash
( dołącz )Jest tylko jeden formularz dołączany:
Uwaga:
&>
over>&
w powyższej sekcji, ponieważ istnieje tylko jeden sposób dołączaniabash
.zsh
pozwala zarówno&>>
i>>&
formy.źródło
&
to znak specjalny, który jest konwertowany na 1 i 2 przez interpreter powłoki?