Что означает> &?

81

Меня немного смутило это выражение:

gcc -c -g program.c >& compiler.txt

Я знаю, &>filenameчто как stdout, так и stderr будут перенаправлены в файл filename. Но в этом случае амперсанд стоит после знака «больше». Похоже, это имеет вид M>&N, где Mи N- дескрипторы файлов.

В приведенном выше фрагменте есть M=1и N='compiler.txt'? Чем это отличается от:

gcc -c -g program.c > compiler.txt     (ampersand removed)

Насколько я понимаю, каждый открытый файл связан с файловым дескриптором больше 2. Это правильно?

Если да, то является ли имя файла взаимозаменяемым с его файловым дескриптором в качестве цели перенаправления?

контрапозитивный
источник

Ответы:

93

Это то же самое, что и &>. На странице руководства bash:

Перенаправление стандартного вывода и стандартной ошибки Эта конструкция позволяет перенаправлять как стандартный вывод (дескриптор файла 1), так и стандартный вывод ошибок (дескриптор файла 2) в файл, имя которого является расширением слова.

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
Иордания
источник
7
Я чувствую себя глупо. Я потратил кучу времени на чтение других источников, и это было прямо на странице руководства.
Contrapositive
3
>&- это синтаксис, используемый csh и tcsh для перенаправления как stdout, так и stderr. Вероятно, поэтому bash его принимает.
Кейт Томпсон
4
Означает ли это, что &>wordи >word 2>&1являются семантически эквивалентными? Антецедент "Это" мне не ясен.
geneorama
8
@geneorama &>word, >word 2>&1, и >&word точно так же.
jordanm
1
Теперь я понимаю, что раньше делал ошибку, основываясь на том, что читал в другом месте. >перенаправляет только стандартный выход. >не перенаправляет ошибку. (Вероятно, мне следует перенаправить свои будущие комментарии на /dev/null)
geneorama
8

&>vs >&: предпочтительная версия &>(clobber)

Что касается:

  • &>
  • >&

оба будут сбивать файл - обрезать его до 0 байтов перед записью в него, как это > fileбыло бы в случае только STDIN.

Однако в bashразделе «Ручные перенаправления» добавлено следующее:

Из двух форм предпочтительнее первая. Это семантически эквивалентно

>word 2>&1

При использовании второй формы слово не может расширяться до числа или -. Если это так, применяются другие операторы перенаправления (см. «Дублирование файловых дескрипторов» ниже) по соображениям совместимости.

(Примечание: в zshобоих эквивалентны .)

Получение памяти пальцев в &>форме first ( ) - очень хорошая практика , потому что:

Использовать &>>как >>&не поддерживается bash(добавить)

Есть только одна форма добавления:

Формат для добавления стандартного вывода и стандартной ошибки:

&>>word

Это семантически эквивалентно

>>word 2>&1

(см. Дублирование файловых дескрипторов ниже).

Заметка:

  • Снова рекомендуется использовать clobber для &>over >&в разделе выше, так как есть только один способ добавления bash.
  • zshпозволяет как &>>и >>&формы.
Том Хейл
источник
Этот ответ намного полезнее, чем ответ, за который проголосовали.
истребительница
так есть &специальный символ, который интерпретатор оболочки преобразует в 1 и 2?
Fakher Mokadem
@FakherMokadem Неа, смотрите мануал .
Том Хейл,