/dev/null в Linux — это файл нулевого устройства. Он удаляет все записанное в него и возвращает при чтении EOF (End of File).
Проще говоря, это такой специальный хак командной строки, который действует как пылесос — затягивает все, что ему брошено.
Давайте посмотрим, что это значит на практике и что мы можем сделать с этим файлом.
Свойства /dev/null
Следующая команда cat вернет символ конца файла (EOF), если вы попытаетесь прочитать его с ее помощью.
cat /dev/null
Валидность файла можно проверить с помощью:
stat /dev/null
Данная команда вернет:
File: /dev/null Size: 0 Blocks: 0 IO Block: 4096 character special file Device: 6h/6d Inode: 5 Links: 1 Device type: 1,3 Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-02-04 13:00:43.112464814 +0530 Modify: 2020-02-04 13:00:43.112464814 +0530 Change: 2020-02-04 13:00:43.112464814 +0530
Этот вывод показывает, что данный файл имеет размер 0 байт, для него выделено ноль блоков. Права доступа к файлу установлены таким образом, что любой может читать/записывать его, но никто не может его выполнять.
Поскольку это не исполняемый файл, мы не можем использовать конвейер — оператор | для перенаправления на /dev/null. Единственный способ — использовать перенаправления файлов (>, >> или <, <<).
На приведенной ниже диаграмме показано, что /dev/null действительно является валидным файлом.
Давайте теперь рассмотрим некоторые распространенные варианты использования /dev/null.
Перенаправление на /dev/null в Linux
Мы можем отказаться от любого вывода скрипта, который мы используем, перенаправив его на /dev/null.
Для примера попробуйте сбросить сообщения команды echo, используя этот файл.
echo 'Hello from JournalDev' > /dev/null
Вы не получите никакого вывода, потому что он будет отправлен в файл.
Давайте попробуем запустить неправильную команду и направить ее вывод в /dev/null.
cat --INCORRECT_OPTION > /dev/null
И мы получим такой вывод:
cat: unrecognized option '--INCORRECT'
Try 'cat --help' for more information.
Почему это происходит? Это связано с тем, что сообщения об ошибках поступают из stderr, а мы перенаправляем только вывод из stdout.
Однако мы также должны учитывать stderr.
Сброс сообщений об ошибках
Давайте перенаправим stderr в /dev/null вместе с stdout. Для этого мы можем использовать файловый дескриптор stderr(=2).
cat --INCORRECT_OPTION > /dev/null 2>/dev/null
Это даст нам желаемый результат.
Есть и другой способ сделать то же самое: сначала перенаправить stderr на stdout, а затем — stdout на /dev/null.
Синтаксис для этого выглядит так:
command > /dev/null 2>&1
Обратите внимание на 2>&1 в конце. Мы перенаправляем stderr(2) на stdout(1). С помощью &1 мы сообщаем оболочке, что конечный файл на самом деле является файловым дескриптором.
Поэтому если мы используем 2>1 (без амперсанда), мы просто перенаправим stderr в файл по имени 1 — а это не то, что нам нужно.
Читайте также: Основные команды Linux: как работает atop