Как работает файл /dev/null в Linux

/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&gt;&1 в конце. Мы перенаправляем stderr(2) на stdout(1). С помощью &1 мы сообщаем оболочке, что конечный файл на самом деле является файловым дескриптором.

Поэтому если мы используем 2>1 (без амперсанда), мы просто перенаправим stderr в файл по имени 1 — а это не то, что нам нужно.

Читайте также: Основные команды Linux: как работает atop

Tags:

Добавить комментарий