Я вижу материал как command 1> out
или с 2>&1
для перенаправления stderr но иногда я также вижу &>
отдельно, и т.д.
Что состоит в том, чтобы понять лучший способ &
и что это означает точно?
&
в 2>&1
просто говорит что число 1
дескриптор файла и не имя файла. В этом случае standard output file descriptor
.
Если Вы используете 2>1
, затем это перенаправило бы ошибки в названный файл 1
но если Вы используете 2>&1
, затем это отправило бы его в standard output stream
.
Это &>
говорит отправляют обоих, standard output
и standard error
, где-нибудь. Например, ls <non-existent_file> &> out.file
. Позвольте мне проиллюстрировать это с примером.
Установка:
Создайте файл koko
со следующим содержанием:
#!bin/bash
ls j1
echo "koko2"
Сделайте это исполняемым файлом: chmod u+x koko
Теперь отметьте это j1
не существует
Теперь выполненный ./koko &> output
выполненный cat output
и Вы будете видеть
ls: cannot access 'j1': No such file or directory
koko2
Оба, standard error
(ls: cannot access 'j1': No such file or directory
) и standard output
(koko2
), были отправлены в файл output
.
Теперь выполните его снова, но на этот раз как так:
./koko > output
Сделать cat output
и Вы будете только видеть koko2
как. Но не вывод ошибок от ls j1
команда. Это будет отправлено в standard error
который Вы будете видеть в своем терминале.
Важное примечание благодаря @Byte Командующему:
Отметьте это в command >file 2>&1
порядок перенаправления важен. Если Вы пишете command 2>&1 >file
вместо этого (который обычно является не, что Вы хотите), это сначала перенаправит команду stdout
в файл и после того перенаправления команда stderr
к его теперь неиспользованный stdout
, таким образом, это обнаружится в терминале, и Вы могли передать его по каналу или перенаправить его снова, но это не будет записано в файл.
> FILE 2>&1
и &> FILE
эквивалентны. См. 8.2.3.2. Перенаправление ошибок из в Руководство Bash для Главы 8
[n]>&word
назван, Копировав Дескриптор Выходного файла (см. раздел 2.7.6 из POSIX Стандарт Языка Shell). Это конкретное поведение является функцией подобных границе оболочек, включая ksh
, dash
, и bash
; на самом деле стандарт базируется вокруг Оболочки Bourne и ksh
. Изучая tcsh и csh руководства, они, по-видимому, не обеспечивают возможность дублирования никакого дескриптора файла, однако из описания >&
, это ведет себя как &>
в bash
(то есть, ошибки перенаправлений и нормальный вывод в файл).
В *отклоняют как системы, включая Ubuntu, Вы часто слышите, что все - файл или скорее дескриптор файла. Стандартный вывод является постоянным дескриптором файла 1, и стандартная погрешность является дескриптором файла 2. Так, > FILE 2>&1
технически дескриптор дубликата файла средств 2 на дескриптор файла 1. Другими словами, этого ответа:
2> &1 говорит оболочке давать команде дескриптор файла 2, который является дубликатом дескриптора 1. (т.е. stderr и stdout указывают на тот же fd).
Ключ здесь должен отметить, что дескриптор 1 должен быть установлен сначала. Поскольку оболочка обрабатывает перенаправления в левом к правильному порядку, command >FILE 2>&1
говорит оболочке повторно соединять stdout проводом для command
войти FILE
во-первых, и только затем дескриптор 2 может стать копией 1, который является 1 и 2 точками к тому же местоположению - FILE
.
Это, конечно, идет вне стандартной погрешности и стандартного вывода. Как показывают в этом ответе, путем выполнения 3&>2
... Вы копируете (dup2) filedescritor 2 на filedescriptor 3, возможно заключительный filedescriptor 3, если это уже открыто
Пример управления дескрипторами файлов, среди многих, получил бы вывод dialog
команда в переменную
Также стоит отметить это &>
характерно для bash
. В zsh
это ведет себя то же, но согласно документации, "... не имеет того же эффекта как‘> Word 2> &1’ в присутствии multios". В совместимом POSIX /bin/sh
, это, рассматривался бы как регулярное перенаправление с помещением команды в фон. См. также, Есть ли какой-либо код sh, который не является синтаксически действительным кодом удара?.
См. также: