С технической точки зрения «/dev/null» является файлом виртуального устройства.
Что касается программ, то они обрабатываются как реальные файлы.
Утилиты могут запрашивать данные из такого рода источников, а операционная система передает им данные.
Но вместо чтения с диска операционная система генерирует эти данные динамически.
Примером такого файла является «/dev/zero».
В этом случае, однако, вы будете записывать в файл устройства
Все, что вы пишете в «/dev/null», отбрасывается, забывается и выбрасывается в пустоту.
Чтобы понять, почему это полезно, вы должны сначала иметь представление о стандартном выводе и стандартной ошибке в операционных системах Linux или * nix.
stdout и stder
Утилита командной строки может генерировать два типа вывода.
Стандартный вывод отправляется на stdout.
Ошибки отправляются в stderr.
По умолчанию stdout и stderr связаны с окном вашего терминала (или консолью).
Это означает, что все, что отправлено на stdout и stderr, обычно отображается на вашем экране.
Но с помощью перенаправления оболочки вы можете изменить это поведение.
Например, вы можете перенаправить стандартный вывод в файл.
Таким образом, вместо отображения вывода на экране, он будет сохранен в файл, который вы сможете прочитать позже, или вы можете перенаправить стандартный вывод на физическое устройство, например, на цифровой светодиод или ЖК-дисплей.
- С 2> вы перенаправляете стандартные сообщения об ошибках. Пример: 2> /dev/null или 2> /home/user/error.log.
- С 1> вы перенаправляете стандартный вывод.
- С &> вы перенаправляете как стандартную ошибку, так и стандартный вывод.
Используйте /dev/null, чтобы избавиться от вывода, который вам не нужен
Поскольку существует два типа вывода: стандартный вывод и стандартная ошибка, первый вариант использования – отфильтровать один тип или другой.
Это легче понять на практическом примере.
Допустим, вы ищете строку в «/sys», чтобы найти файлы, которые относятся к настройкам питания.
grep -r power /sys/
Будет много файлов, которые обычный пользователь без прав root не сможет прочитать.
Это приведет к множеству ошибок «Отказано в доступе».
Это затрудняет поиск результатов, которые вы ищете.
Поскольку ошибки «Permission denied» являются частью stderr, вы можете перенаправить их на «/dev/null».
grep -r power /sys/ 2>/dev/null
Как видите, это гораздо легче читать.
В других случаях может быть полезно сделать обратное: отфильтровать стандартный вывод, чтобы вы могли видеть только ошибки.
ping itisgood.ru 1>/dev/null
На приведенном выше примере показано, что без перенаправления ping отображает свой обычный вывод, когда он может достичь конечного компьютера.
Во втором случае ничего не отображается, когда машина подключена к сети, но как только она отключается, отображаются только сообщения об ошибках.
Вы можете перенаправить как stdout, так и stderr в два разных места.
ping itisgood.ru 1>/dev/null 2>error.log
В этом случае сообщения стандартного вывода вообще не будут отображаться, а сообщения об ошибках будут сохраняться в файле «error.log».
Перенаправить весь вывод в /dev/null
Иногда полезно избавиться от всего вывода.
Есть два способа сделать это.
grep -r power /sys/ >/dev/null 2>&1
Строка > /dev/null означает «отправить stdout в /dev/null», а вторая часть, 2>&1, означает отправить stderr в stdout.
В этом случае вы должны ссылаться на стандартный вывод как «&1» вместо простого «1.».
Запись «2>1» просто перенаправит стандартный вывод в файл с именем «1».
Здесь важно отметить, что порядок важен.
Если вы измените параметры перенаправления следующим образом:
grep -r power /sys/ 2>&1 >/dev/null
это не будет работать как задумано.
Это потому, что, как только 2>&1 интерпретируется, stderr отправляется на стандартный вывод и отображается на экране.
Затем stdout подавляется при отправке в «/dev/null».
В конечном итоге вы увидите ошибки на экране вместо того, чтобы подавлять все выходные данные.
Если вы не можете вспомнить правильный порядок, существует более простое перенаправление, которое гораздо проще набрать:
grep -r power /sys/ &>/dev/null
В этом случае &>/dev/null эквивалентно сообщению «перенаправить как stdout, так и stderr в это местоположение».
Другие примеры, где это может быть полезно для перенаправления в /dev/null
Скажем, вы хотите увидеть, как быстро ваш диск может читать последовательные данные.
dd if=ubuntu16.04.iso of=/dev/null status=progress bs=1M iflag=direct
Заключение
Надеемся, что примеры из этой статьи могут вдохновить вас на поиск собственных творческих способов использования «/dev/null».
Знаете интересный скрипт использования этого специального файла устройства? Оставьте комментарий ниже и поделитесь знаниями!