Во-первых, все после >
или >>
- это имя файла; поэтому > 1
записывает в файл с именем 1
.
Числа в других формах, приведенных в вашем примере, являются дескрипторами файлов. По умолчанию программы запускаются с подключенными дескрипторами файлов 0 (стандартный ввод), 1 (стандартный вывод) и 2 (стандартная ошибка); когда вы запускаете программу из интерактивной оболочки, они подключаются к вводу и выводу терминала (вы можете увидеть это, запустив ls -l / proc / $$ / fd
в Linux).
Указание числа перед >
, >>
или > &
указывает дескриптор файла, которым вы хотите управлять; число должно быть прямо перед символом >
. Таким образом,
echo Example 2> stderr
напечатает «Пример» и создаст пустой файл stderr
(который будет содержать все, что отправлено в стандартную ошибку).
Вы можете думать о файловых дескрипторах как о записях в таблице, указывающих на файлы; таким образом, по умолчанию:
/ dev / tty
/ dev / tty
/ dev / tty
Указание 1> файл
(или просто > файл
) обновляет дескриптор файла 1, чтобы он указывал на файл
, открытый в режиме усечения (поэтому его содержимое заменяется). Указание 2> 1
обновляет дескриптор 2 файла, чтобы он указывал на файл с именем 1
, открытый в режиме усечения.
Дублирование файловых дескрипторов с использованием > &
(или &>
, что является предпочтительной формой) просто обновляет один файловый дескриптор, чтобы он указывал на то, на что указывает другой.В вашем последнем примере > файл
обновляет дескриптор файла 1:
/ dev / tty
файл
/ dev / tty
, а затем 2> & 1
обновляет дескриптор файла 2:
/ dev / tty
файл
файл
(порядок важен: > файл 2> & 1
производит вышеуказанное, 2> & 1> файл
в конечном итоге перенаправляет только дескриптор файла 1).
Форма 1> & 9
работает, только если дескриптор файла 9 был открыт, например. , скопировав в него дескриптор файла 1 ( 9> & 1
) или открыв файл ( 9> файл
). Этот тип конструкции может быть полезен для отслеживания исходного содержимого файловых дескрипторов при перенаправлении; таким образом, в сценарии вы можете безопасно скопировать 1 и 2, перенаправить стандартный вывод и ошибку для любых целей, а затем восстановить их ...
В руководстве Bash есть все подробности.