Мы уже неоднократно говорили про то, что основной принцип Linux-дистрибутивов звучит как «все есть файл». Среди огромного множества всего, что можно назвать файлом, согласно этому подходу, есть вещи, представляющие особый интерес. Одной из таких вещей является так называемое «нулевое устройство» или /dev/null. Про то, что это такое и как можно это «устройство» использовать поговорим дальше.
Среди подписчиков канала проходит розыгрыш. Чтобы принять в нем участие подпишитесь на канал и перейдите по ссылке ниже. Таким образом убьете двух зайцев: будете получать интересный и полезный контент по Linux и получите возможность стать обладателем одного из интересных призов.
Что такое /dev/null?
Это специальный файл, который является виртуальным устройством (то есть, устройством не связанным с реальным, физическим оборудованием вашего ПК) и который, в отличии от других виртуальных файлов Linux, используется для записи в него данных. При этом, все что вы в него будете записывать будет отброшено, забыто, стерто. Этакая черная дыра, поглощающая все, что в нее попадает и ничего не отдающая обратно.
Для чего же необходимо направлять данные в эту «черную дыру»? Рассмотрим популярные сценарии использования.
Перенаправление вывода в /dev/null
Помните про стандартные потоки ввода/вывода/ошибки, про которые мы говорили в предыдущей заметке? Именно работа с ними явно покажет, как и зачем можно использовать нулевое устройство.
Вспоминаем, что при запуске любой программы в Linux она генерирует два стандартных потока - stdout (поток вывода) и stderr (поток ошибки). Каждый из них имеет численное обозначение, называемое также файловый дескриптор - stdout обозначается как 1, stderr как 2. И опять-таки, используя эти дескрипторы мы можем перенаправить потоки в файлы.
Но что если, запуская команду, мы знаем, что там будут ошибки и показывать их в выводе просто-напросто не нужно? Для такого случая как раз и подойдет нулевое устройство. Например, давайте попробуем найти строку hello в системном каталоге /sys при помощи швейцарского ножа grep.
grep -r hello /sys/
Команда вызовет большое количество ошибок, так как без привилегий суперпользователя доступ к ряду файлов получить нельзя. Об этом нам сообщает текст «Отказано в доступе». Но опять-же, мы знаем про эту ошибку и постоянно наблюдать ее в выводе просто-напросто ни к чему. Воспользуемся /dev/null:
grep -r hello /sys/ 2> /dev/null
Видим теперь, что вывод ошибок направляется в нулевое устройство и пропадает там навсегда. Если бы в папке /sys были файлы, содержащие строку hello, то команда grep вывела бы только информацию о них.
Теперь давайте попробуем сосредоточиться только на ошибках, игнорируя успешное выполнение команды. Такое бывает необходимо для того, чтобы понять причину ошибки и особенности ее возникновения. Например, мы при помощи команды ping решили проверить доступность какого-нибудь ресурса:
ping google.com
Видим, что сервер прекрасно доступен, но нас интересует не удачные обращения к нему, а те отправки пакетов, которые встречают ошибки. Для этого перенаправим файловый дескриптор 1 в нулевое устройство, оставив для вывода в консоль только ошибки.
ping google.com 1> /dev/null
Естественно, что пример с Google только для вида, его можно заменить как-раз таки тем ресурсом, с которым есть проблемы при отправке сетевых пакетов.
Если вы еще не подписались на уведомления канала в Телеграмм, то самое время сделать это! Так вы сможете первыми узнавать о том, что на Просто Код вышла очередная заметка.
Перенаправление всего вывода в /dev/null
Бывают моменты, когда вывод оказывается полностью бесполезным. Например, если вы написали bash-скрипт и запускаете его посредством cron на каком-либо сервере по расписанию. В такой момент никто не увидит «выхлоп» скрипта, потому выводить его в консоль бессмысленно. Тогда можно спрятать все, что отдает команда в /dev/null. Вернемся к нашей команде поиска строки hello.
grep -r hello /sys/ > /dev/null 2>&1
Как видим, команда не выводила ни ошибок, ни найденных совпадений (даже если бы они и были). Она отработала и закрылась без лишних шума и пыли.
Еще один пример использования нулевого устройства
Данный пример очень условный, но показательный. В одной из самых первых заметок на канале я рассказывал про утилиту dd, которую использую для записи установочных образов на флэшку.
Соединив эту команду с нулевым устройством можно будет проверить скорость последовательного чтения жесткого диска.
dd if="ubuntu-22.10-desktop-amd64.iso" of=/dev/null status=progress bs=1M iflag=direct
Только что мы записали образ Ubuntu 22.10 на нулевое устройство, отобразив скорость того самого чтения диска, на котором выполнялась команда. Полученные цифры, конечно же, крайне неточные, но интересен сам подход при сочетании dd и /dev/null.
Подведем итог
Обобщая все, о чем говорили выше, можно сказать, что нулевое устройство Linux может использоваться для того, чтобы:
- прятать очевидные ошибки при работе команды
- выводить только ошибки при работе команды
- прятать весь «выхлоп» от работы команды в случае, если он не нужен
Опять-таки, повторюсь, что чаще всего перенаправление в нулевое устройство Linux используется в bash-скриптах.
Если заметка оказалась полезной, интересной, если вы из нее узнали что-то новое, то не забудьте поддержать пост лайком и комментарием, а канал подпиской. Больше подобных материалов вы можете найти в соответствующих рубриках.