Неверно говорить, что "/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: /';