Що таке /Dev/Null

Що таке /Dev/Null
Переклад 3 хв. читання
23 серпня 2023

/dev/null - це один з найпоширеніших спеціальних віртуальних пристроїв у Linux. У цьому посібнику ми про це поговоримо і покажемо різні способи його використання.

Що таке /Dev/Null у Linux

Linux розглядає все як файли, незалежно від того, чи це драйвер, чи пристрій. Каталог /dev використовується для зберігання всіх фізичних і віртуальних пристроїв. Якщо ви працювали з розбиттям диска на розділи, ви могли бачити, як використовується каталог /dev. Наприклад: /dev/sda, /dev/sdb1 тощо.

Кожен зі спеціальних віртуальних пристроїв має унікальні властивості. Наприклад, читання з /dev/zero повертає символи ASCII NUL. Деякі з популярних віртуальних пристроїв включають:

  • /dev/null
  • /dev/zero
  • /dev/random
  • /dev/urandom

/dev/null - це нульовий пристрій, який відкидає будь-які дані, що на нього записуються. Однак, він повідомляє, що операція запису пройшла успішно. У термінології UNIX цей нульовий пристрій також називають бітовим відром або чорною дірою.

Використання /Dev/Null у Linux

Властивості /Dev/Null

При спробі читання з /dev/null повертається символ EOF:

$ cat /dev/null
$ 

Попри свої унікальні особливості, /dev/null є повноцінним файлом. Ми можемо перевірити це за допомогою наступної команди

$ stat /dev/null
  File: /dev/null
  Size: 0         	Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d	Inode: 5           Links: 1     Device type: 1,3
Access: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-08-21 11:04:59.656627857 +0300
Modify: 2023-08-21 11:04:59.656627857 +0300
Change: 2023-08-21 11:04:59.656627857 +0300
 Birth: 2023-08-21 11:04:55.224000000 +0300

Базове використання

Все, що записано до /dev/null, буде знищено назавжди. Наступний приклад демонструє цю властивість:

$ echo "hello world" > /dev/null
$ cat /dev/null
$ 

Тут ми перенаправили STDOUT команди echo на /dev/null. За допомогою команди cat ми зчитуємо вміст /dev/null.

Оскільки /dev/null не зберігає жодних даних, у виводі команди cat нічого не буде.

Перенаправлення виводу команд до /Dev/Null

Потрібно запустити команду, не цікавлячись її виводом? Ми можемо перенаправити дані до /dev/null для безпечного скидання. Для реалізації цієї техніки потрібні попередні знання дескрипторів файлів: STDIN, STDOUT і STDERR.

Приклад 1:

Розглянемо перший приклад:

$ echo "hello world" > /dev/null
$ 

Тут ми перенаправляємо STDOUT команди echo до /dev/null. Тому вона не буде виводитися на екран консолі.

Приклад 2:

Розглянемо наступний приклад:

$ asdfghjkl > /dev/null
asdfghjkl: command not found
$ 

Тут команди asdfghjkl не існує. Отже, Bash видасть помилку. Однак, повідомлення про помилку не було скинуто до /dev/null. Це тому, що повідомлення про помилку зберігається в STDERR. Отже, нам також потрібно вказати перенаправлення на STDERR (2). Ось оновлена команда:

$ asdfghjkl 2> /dev/null
$ 
Приклад 3:

Що робити, якщо ми хочемо перенаправити як STDOUT, так і STDERR на /dev/null? Структура команд буде виглядати наступним чином:

$ cat somefile.txt > /dev/null 2> /dev/null
$

Хоча ця структура є абсолютно правильною, вона є багатослівною та надлишковою. Існує спосіб значно скоротити структуру: спочатку перенаправити STDERR на STDOUT, а потім перенаправити STDOUT на /dev/null.

Ознайомтеся з оновленою командою:

$ cat employees.txt > /dev/null 2>&1
$

Тут STDOUT перенаправлено на /dev/null. Потім ми перенаправляємо STDERR (2) на STDOUT (1). "&1" вказує командному інтерпретатору, що призначенням є дескриптор файлу, а не ім'я файлу.

Тепер команда стала ефективнішою.

Висновок

Ми дізналися про /dev/null, нульовий пристрій у Linux. Ми також продемонстрували, як він працює на різних прикладах. Ці методи широко використовуються в командному інтерпретаторі.

Джерело: What Is /Dev/Null
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація

Читайте також: stdout, stderr, stdin stdout