Co znaczy> &?

81

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 Mi Nsą deskryptory plików.

W powyższym fragmencie, czy M=1i 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?

kontrapozytywny
źródło

Odpowiedzi:

93

To jest to samo co &>. Ze strony podręcznika bash:

Przekierowywanie standardowego wyjścia i standardowego błędu Ta konstrukcja umożliwia przekierowanie zarówno standardowego wyjścia (deskryptor pliku 1), jak i standardowego wyjścia błędów (deskryptor pliku 2) do pliku, którego nazwa jest rozwinięciem słowa.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1
jordanm
źródło
7
Czuję się głupio. Spędziłem sporo czasu na czytaniu innych źródeł i znalazłem to na stronie podręcznika.
kontrapozytywny
3
>&to składnia używana przez csh i tcsh do przekierowania zarówno stdout, jak i stderr. Prawdopodobnie dlatego bash to akceptuje.
Keith Thompson
4
Czy to oznacza, że &>wordi >word 2>&1są semantycznie równoważne? Poprzednik „To” nie jest dla mnie jasny.
geneorama
8
@geneorama &>word, >word 2>&1, i >&word są dokładnie takie same.
jordanm
1
Teraz zdaję sobie sprawę, że popełniłem błąd wcześniej na podstawie tego, co przeczytałem gdzie indziej. >tylko przekierowania standardowe. >nie przekierowuje błędu. (Prawdopodobnie powinienem przekierować moje przyszłe komentarze do /dev/null)
geneorama
9

&>vs >&: preferowana wersja to &>(clobber)

Jeżeli chodzi o:

  • &>
  • >&

oba zbiją plik - skracają go do 0 bajtów przed zapisaniem do niego, tak jak > filezrobiłoby to w przypadku tylko STDIN.

Jednak The bashobsługi sekcja przekierowania dodaje, że:

Spośród dwóch form preferowana jest pierwsza. Jest to semantycznie równoważne z

>word 2>&1

W przypadku używania drugiej formy wyraz nie może być rozszerzany do liczby lub -. Jeśli tak, ze względu na zgodność mają zastosowanie inne operatory przekierowania (zobacz poniżej Duplikowanie deskryptorów plików).

(Uwaga: w zshobie są równoważne ).

Bardzo dobrą praktyką jest uzyskanie pamięci palca w pierwszej ( &>) formie, ponieważ:

Użyj &>>tak, jak >>&nie jest obsługiwane przez bash( dołącz )

Jest tylko jeden formularz dołączany:

Format dołączania standardowego wyjścia i standardowego błędu to:

&>>word

Jest to semantycznie równoważne z

>>word 2>&1

(patrz Powielanie deskryptorów plików poniżej).

Uwaga:

  • Ponownie zalecane jest użycie znaku &>over >&w powyższej sekcji, ponieważ istnieje tylko jeden sposób dołączania bash.
  • zshpozwala zarówno &>>i >>&formy.
Tom Hale
źródło
Ta odpowiedź jest znacznie bardziej pomocna niż odpowiedź za głosem.
pogromca
więc jest &to znak specjalny, który jest konwertowany na 1 i 2 przez interpreter powłoki?
Fakher Mokadem
@FakherMokadem Nie, zobacz instrukcję .
Tom Hale,