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


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

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. Это правильно?

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

2 60

2 ответа:

это то же самое, что &>. С главной страницы bash:

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

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

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

о:

  • &>
  • >&

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

на bash раздел перенаправления вручную добавляет, что:

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

>word 2>&1

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

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

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

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

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

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

&>>word

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

>>word 2>&1

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

Примечание:

  • использование clobber &> over >& в раздел выше снова рекомендуется, учитывая, что есть только один способ добавления в bash.
  • zsh позволяет &>> и >>& "формы".