Когда мы используем «2> & 1» на практике? - PullRequest
0 голосов
/ 28 марта 2020

Насколько я понимаю, "/ dev / null 2> & 1" отключает программу (весь вывод и ошибки подавляются). А как насчет "2> & 1" без / dev / null? Например,

ls -ld / tmp / tnt 2> & 1

Какое практическое использование "2> & 1" без / dev / null? Есть ли смысл? (Это дает точно такой же вывод как:

ls -ld / tmp / tnt)

Ответы [ 3 ]

0 голосов
/ 28 марта 2020

Что делает 2>&1, так это делает сообщения об ошибках go в стандартный поток вывода.

Что означает символ crypti c, это более длинное объяснение.

Процесс имеет два специальных выходных потока, называемых «стандартный вывод» (для обычного вывода) и «стандартная ошибка» (для сообщений об ошибках). Они раздельные, так что программа может сообщать об ошибках на терминале, даже если вы перенаправляете обычный вывод в файл.

У любого потока открытых файлов есть связанный с ним номер, этот номер называется «дескриптором файла» ( кратко) Это то, как операционная система отслеживает файлы, с которыми работает процесс. Стандартный вывод получает число (дескриптор файла) 1, стандартная ошибка получает номер (fd) 2.

2>&1 устанавливает дескриптор файла 2 как копию дескриптора файла 1. Если вы перенаправили вывод для файла, такого как / dev / null, fd 1 ссылается на открытый файл, и это заставит fd 2 ссылаться на тот же открытый файл.

0 голосов
/ 28 марта 2020

Неверно говорить, что "/dev/null 2>&1" makes the program silent. В отдельности это выражение неполное. Например, echo foo /dev/null 2>&1 передает foo и /dev/null в качестве аргументов для echo и запускает echo с потоком stderr, перенаправленным на его стандартный вывод. С другой стороны, чаще можно увидеть:

echo foo > /dev/null 2>&1

, который перенаправляет stdout в / dev / null, а затем перенаправляет stderr в stdout (который теперь / dev / null, поэтому оба потока go go / dev / null). Обратите внимание, что порядок значим, и echo foo 2>&1 > /dev/null запишет ошибки в стандартный вывод вызывающего процесса при записи вывода в / dev / null.

Распространенная причина использования этого вида дублирования потока - это когда вы хотите контролировать, где вывод и ошибки go. Например, если вы хотите применить фильтр к stderr, вы можете отменить вывод и отфильтровать ошибки с помощью:

cmd 2>&1 > /dev/null | sed 's/^/ERROR: /g' >&2

Это тривиальный пример, предназначенный просто для демонстрации. Чтобы применить фильтр к обоим потокам независимо, вы можете сделать следующее:

{ cmd 2>&1 >&3 | sed 's/^/ERROR: /' >&2; } 3>&1 | sed 's/^/OUT:   /';
0 голосов
/ 28 марта 2020

2>&1 говорит о перенаправлении stdout, а также stderr в тот же файл.

Обычно это полезно при отладке.

...