Ответы:
В &
in 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 Commander:
Обратите внимание, что command >file 2>&1
порядок перенаправления важен. Если вы пишете command 2>&1 >file
вместо этого (что обычно не то, что вам нужно), то сначала он перенаправит команду stdout
в файл, а после этого перенаправит команду stderr
на ее теперь неиспользуемую stdout
, так что она будет отображаться в терминале, и вы можете передать ее или перенаправить еще раз, но он не будет записан в файл.
command >file 2>&1
порядок перенаправлений важен. Если вы command 2>&1 >file
вместо этого напишите (что обычно не то, что вам нужно), он сначала перенаправит стандартный вывод команды в файл, а после этого перенаправит стандартный вывод команды на ее теперь неиспользуемый стандартный вывод, так что он будет отображаться в терминале, и вы можете передать его по конвейеру. или перенаправьте его снова, но он не будет записан в файл.
standard output
который вы увидите в своем терминале». не должно ли это быть "к standard error
"?
> FILE 2>&1
и &> FILE
эквивалентны. См. 8.2.3.2. Перенаправление ошибок в Bash Guide для начинающих Глава 8
&> FILE
специфичен только для Bash, тогда >FILE 2>&1
как понимается большее количество оболочек.
Это [n]>&word
называется дублированием дескриптора выходного файла (см. Раздел 2.7.6 стандарта языка оболочки POSIX). Это конкретное поведение особенностью Борн-подобных оболочек, в том числе ksh
, dash
и bash
; на самом деле, стандарт основан на оболочке Bourne и ksh
. Глядя в Tcsh и CSH руководства, они , видимо , не дают возможности дублирования любого файлового дескриптора, однако из описания >&
, это ведет себя как &>
в bash
(то есть, перенаправляет ошибки и нормальный вывод в файл).
В * nix-подобных системах, включая Ubuntu, вы часто слышите, что все является файловым или, скорее, файловым дескриптором . Стандартный вывод - константный дескриптор файла 1, а стандартная ошибка - дескриптор файла 2. Таким образом, > FILE 2>&1
технически означает дублирование дескриптора файла 2 на дескриптор файла 1. Другими словами, этот ответ :
2> & 1 говорит оболочке дать команде дескриптор файла 2, который является дубликатом дескриптора 1. (т. Е. Stderr & stdout указывают на тот же fd).
Ключевым моментом здесь является то, что дескриптор 1 должен быть установлен первым. Поскольку процессы оболочки переназначения в порядке слева направо, то command >FILE 2>&1
говорит оболочки перемонтировать стандартный вывод для command
идти в FILE
первый, и только затем дескриптор 2 может стать копией 1, то есть 1 и 2 указывают на то же место - FILE
.
Это, конечно, выходит за рамки стандартной ошибки и стандартного вывода. Как показывают в этом ответе , делая3&>2
... вы дублируете (dup2) файловый дескриптор 2 на файловый дескриптор 3, возможно закрывая файловый дескриптор 3, если он уже открыт
Примером манипулирования файловыми дескрипторами, среди многих, будет захват вывода dialog
команды в переменную
Стоит также отметить, что &>
конкретно для bash
. В zsh
этом ведет себя так же, но в соответствии с документацией, «... не имеет такой же эффект , как„> слово 2> & 1“в присутствии multios». В POSIX-совместимости /bin/sh
это рассматривается как обычное перенаправление с переводом команды в фоновый режим. Смотрите также, есть ли какой-нибудь sh-код, который не является синтаксически верным bash-кодом? ,
Смотрите также:
&>
значит?