/dev/нуль в Linux
/dev/null в Linux — это файл нулевого устройства. Это удалит все записанное в него и вернет EOF при чтении.
Это хак из командной строки, который действует как пылесос, который всасывает все, что ему брошено.
Давайте посмотрим, что это значит и что мы можем сделать с этим файлом.
/dev/null Свойства
Это вернет символ конца файла (EOF), если вы попытаетесь прочитать его с помощью команды cat.
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
, чтобы сообщить оболочке, что конечный файл является файловым дескриптором, а не именем файла.
cat --INCORRECT_OPTION > dev/null 2>&1
Поэтому, если мы используем 2>1
, мы перенаправим stderr
только в файл с именем 1
. Это не то, что мы хотим!
Заключение
Надеюсь, это немного проясняет ситуацию, так что теперь вы можете использовать /dev/null в Linux, зная, что это значит! Не стесняйтесь задавать вопросы в разделе комментариев ниже.
Рекомендации
- Вопрос о StackOverflow