Что означает "> /dev/null 2>&1"?

Долгое время никто не мог объяснить мне, что за амперсанды, знаки и цифры идут после юниксовых команд. При этом все примеры были показаны без объяснения – зачем все это? Гугл также не давал ответа. Особенно заметно использование таких команд во время работы компилятора. В этой статье постараюсь объяснить эти странные команды.
К примеру, у нас есть такая строчка:

Перенаправление вывода
Оператор > (“больше чем”), как в примере выше, переадресовывает вывод программы. В данном случае, что-что отправляется в /dev/null, а что-что переадресовывается в &1.
Стандартные ввод, вывод и ошибка
Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.
Результат программы обычно печатается в стандартной вывод и иногда в файл “STDERR” (ошибка). Все это три дескриптора файла (вы можете представить их как “потоки данных”, пришли из языка программирования C), которые часто называют STDIN, STDOUT и STDERR.
Но часто к ним обращаются не по имени, а по номеру:
0 – STDIN, 1 – STDOUT и 2 – STDERR
По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT.
В нашем примере видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод). Затем все ошибки (то есть STDERR) перенаправить в стандартный вывод. Необходимо поставить амперсанд “&” перед номером назначения.
Смысл вкратце – “весь вывод указанной команды спихнуть в черную дыру!“.
Это один из способов сделать программу по-настоящему безмолвной. Добавлю, что команда в примере аналогична команде

Официальный FAQ FreeBSD предупреждает: отправка данных в /dev/null/ перегревает ваш процессор!


© на английском, первая публикация перевода – blogs/nix

Җавап калдыру



All fields are required. Your email address will not be published.