Что означает & именно в перенаправлении вывода?

19

Я вижу такие вещи, как command 1> outили с помощью 2>&1перенаправления stderr, но иногда я также вижу &>сам по себе и т. Д.

Каков наилучший способ понять &и что именно это означает?

AJJ
источник

Ответы:

26

В &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. Позвольте мне проиллюстрировать это на примере.

Настроить:

  1. Создайте файл kokoсо следующим содержанием:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Сделайте его исполняемым: chmod u+x koko

  3. Теперь обратите внимание, что j1не существует

  4. Теперь беги ./koko &> output

  5. беги 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, так что она будет отображаться в терминале, и вы можете передать ее или перенаправить еще раз, но он не будет записан в файл.

Джордж Удосен
источник
2
Что &>значит?
AJJ
1
Обратите внимание, что command >file 2>&1порядок перенаправлений важен. Если вы command 2>&1 >fileвместо этого напишите (что обычно не то, что вам нужно), он сначала перенаправит стандартный вывод команды в файл, а после этого перенаправит стандартный вывод команды на ее теперь неиспользуемый стандартный вывод, так что он будет отображаться в терминале, и вы можете передать его по конвейеру. или перенаправьте его снова, но он не будет записан в файл.
Byte Commander
2
«Это будет отправлено на тот, standard outputкоторый вы увидите в своем терминале». не должно ли это быть "к standard error"?
frarugi87
1
Да @ frarugi87 ваше право исправлено
Джордж Удосен
1
@ Джордж вау, ты был быстр;) Хорошая работа
frarugi87
5

> FILE 2>&1и &> FILEэквивалентны. См. 8.2.3.2. Перенаправление ошибок в Bash Guide для начинающих Глава 8

Дж. Старнс
источник
2
IIRC &> FILEспецифичен только для Bash, тогда >FILE 2>&1как понимается большее количество оболочек.
Byte Commander
@ByteCommander, ооо, я даже не знал, что у bash была такая стенография ... Я всегда использовал 2> & 1.
Псуси
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-кодом? ,

Смотрите также:

Сергей Колодяжный
источник