Разница между 2 & -, 2> /dev /null, | &> /dev /null и> /dev /null 2 ​​& 1

Просто ищите разницу между

    2>&- литий> 2>/dev/null литий>
  • |&
  • &>/dev/null литий>
  • >/dev/null 2>&1

и их переносимость с non-Bourne shells, такими как tcsh, mksh и т. д.

156 голосов | спросил Det 3 AMpWed, 03 Apr 2013 05:25:11 +040025Wednesday 2013, 05:25:11

3 ответа


202

Для фона:

  • a номер 1 = стандартный (т. е. STDOUT)
  • a номер 2 = стандартная ошибка (т. е. STDERR)
  • Если число явно не указано, то число 1 предполагается оболочкой (bash)

Сначала давайте рассмотрим их функцию. Для справки см. Расширенное руководство по созданию Bash-скриптов .

Функции

2>&-

Общая форма этого кода M>&-, где "М" - номер дескриптора файла. Это закроет выход для того, на что ссылается файловый дескриптор, т. Е. «М» .

2>/dev/null

Общий вид этого метода - M>/dev/null, где "М" - номер дескриптора файла. Это перенаправит дескриптор файла, «М» , на /dev/null.

2>&1

Общий вид этого метода - M>&N, где "M" & "N" - это номера дескрипторов файлов. Он объединяет выходные данные дескрипторов файлов «М» и «N» в один поток.

|&

Это просто аббревиатура для 2>&1 |. Он был добавлен в Bash 4.

&>/dev/null

Это просто аббревиатура для >/dev/null 2>&1. Он перенаправляет дескриптор файла 2 (STDERR) и дескриптор 1 (STDOUT) на /dev/null.

>/dev/null

Это просто аббревиатура для 1>/dev/null. Он перенаправляет дескриптор файла 1 (STDOUT) на /dev/null.

Переносимость для не-bash, tcsh, mksh и т. д.

Я не много разбирался с другими оболочками вне csh и tcsh. Мой опыт работы с этими 2 по сравнению с операторами перенаправления bash заключается в том, что bash превосходит в этом отношении. Подробнее см. справочную страницу tcsh .

Из команд, о которых вы просили, ни один из них напрямую не поддерживается csh /tcsh. Для создания подобных функций вам придется использовать разные синтаксисы.

ответил slm 3 AMpWed, 03 Apr 2013 07:44:05 +040044Wednesday 2013, 07:44:05
9

Это для перенаправления STDERR & STDOUT:

  • 2>/dev/null

    Перенаправить STDERR в /dev /null (не показывать на консоли)

  • |&

    Перенаправить STDERR и STDOUT в STDIN команды pipeed (cmd1 | & cmd2)

  • &>/dev/null

    Перенаправить и STDERR & STDOUT to /dev /null (ничего не отображается на консоли)

  • >/dev/null

    Перенаправить STDOUT в /dev /null (на консоли отображается только STDERR)

  • 2>&-

    Используется для закрытия дескриптора файла, используемого при перенаправлении

Это все стандартные методы перенаправления для оболочек Bourne.

ответил BriGuy 3 AMpWed, 03 Apr 2013 06:25:20 +040025Wednesday 2013, 06:25:20
1

Рассмотрим это добавление к выбранному ответу. Возможно, вам захочется узнать, какие формы являются POSIX, а какие нет.

Применяются две формы POSIX:

  

2.7.2 Перенаправление вывода

     

Два общих формата для перенаправления вывода:

     

[n]> слово

     

[п] > | слово

     

, где необязательный n обозначает номер дескриптора файла. Если   номер опущен, перенаправление должно относиться к стандартным выводам   (дескриптор файла 1).

     

Перенаправление вывода с использованием '>' формат не удастся, если noclobber   (см. описание набора -C) и файл, названный   расширение слова существует и является обычным файлом. В противном случае,   перенаправление с использованием '>' или "> \" форматы должны вызывать файл,   имя является результатом расширения слова, которое будет создано и   вывод в дескрипторе заданного файла или стандартный вывод, если ни один   . Если файл не существует, он должен быть создан;   в противном случае он будет усечен как пустой файл после   открыт.

-

  

2.7.6 Дублирование дескриптора выходного файла

     

Оператор перенаправления:

     

[п] > & амп; слово

     

должен дублировать один дескриптор выходного файла из другого или должен   Близкий. Если слово оценивает одну или несколько цифр, файл   дескриптор, обозначаемый n, или стандартный вывод, если n не указано,   должна быть сделана копией файлового дескриптора, обозначаемого словом; если   цифры в слове не представляют собой файловый дескриптор, уже открытый для   выход, возникает ошибка перенаправления; см. Последствия Shell   Ошибки. Если слово оценивается как «-», дескриптор файла n или стандартный   вывод, если n не указан, закрыт. Попытки закрыть файл   дескриптор, который не открыт, не должен представлять собой ошибку. Если слово   оценивает что-то еще, поведение неуказано.

Таким образом:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

Последняя строка не в исходном вопросе, но она работает без жалобы в bash. (Также работает с /dev /tty, замененным на /dev /null).

ответил Craig Hicks 30 MaramFri, 30 Mar 2018 06:10:17 +03002018-03-30T06:10:17+03:0006 2018, 06:10:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132