Что значит и что?

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

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

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

Ответ 1

Это то же самое, что и &>. Из bash manpage:

Перенаправление стандартного вывода и стандартная ошибка     Эта конструкция допускает как стандартный вывод (дескриптор файла 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