Я вижу такие вещи, как command 1> out
или с помощью 2>&1
перенаправления stderr, но иногда я также вижу &>
сам по себе и т. Д.
Каков наилучший способ понять &
и что именно это означает?
Я вижу такие вещи, как command 1> out
или с помощью 2>&1
перенаправления stderr, но иногда я также вижу &>
сам по себе и т. Д.
Каков наилучший способ понять &
и что именно это означает?
В &
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. Другими словами, этот ответ :Ключевым моментом здесь является то, что дескриптор 1 должен быть установлен первым. Поскольку процессы оболочки переназначения в порядке слева направо, то
command >FILE 2>&1
говорит оболочки перемонтировать стандартный вывод дляcommand
идти вFILE
первый, и только затем дескриптор 2 может стать копией 1, то есть 1 и 2 указывают на то же место -FILE
.Это, конечно, выходит за рамки стандартной ошибки и стандартного вывода. Как показывают в этом ответе , делая
3&>2
Примером манипулирования файловыми дескрипторами, среди многих, будет захват вывода
dialog
команды в переменнуюСтоит также отметить, что
&>
конкретно дляbash
. Вzsh
этом ведет себя так же, но в соответствии с документацией, «... не имеет такой же эффект , как„> слово 2> & 1“в присутствии multios». В POSIX-совместимости/bin/sh
это рассматривается как обычное перенаправление с переводом команды в фоновый режим. Смотрите также, есть ли какой-нибудь sh-код, который не является синтаксически верным bash-кодом? ,Смотрите также:
источник