Меня немного смутило это выражение:
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. Это правильно?
Если да, то является ли имя файла взаимозаменяемым с его файловым дескриптором в качестве цели перенаправления?
источник
>&
- это синтаксис, используемый csh и tcsh для перенаправления как stdout, так и stderr. Вероятно, поэтому bash его принимает.&>word
и>word 2>&1
являются семантически эквивалентными? Антецедент "Это" мне не ясен.&>word
,>word 2>&1
, и>&word
точно так же.>
перенаправляет только стандартный выход.>
не перенаправляет ошибку. (Вероятно, мне следует перенаправить свои будущие комментарии на/dev/null
)&>
vs>&
: предпочтительная версия&>
(clobber)Что касается:
&>
>&
оба будут сбивать файл - обрезать его до 0 байтов перед записью в него, как это
> file
было бы в случае только STDIN.Однако в
bash
разделе «Ручные перенаправления» добавлено следующее:(Примечание: в
zsh
обоих эквивалентны .)Получение памяти пальцев в
&>
форме first ( ) - очень хорошая практика , потому что:Использовать
&>>
как>>&
не поддерживаетсяbash
(добавить)Есть только одна форма добавления:
Заметка:
&>
over>&
в разделе выше, так как есть только один способ добавленияbash
.zsh
позволяет как&>>
и>>&
формы.источник
&
специальный символ, который интерпретатор оболочки преобразует в 1 и 2?