Що таке /dev/null у Linux?

 3917

З технічної точки зору /dev/null в Linux — це файл віртуального пристрою. Програми та утиліти можуть взаємодіяти з ним як зі справжнім файлом: запитувати дані, а також надсилати до нього будь-яку інформацію. Але все, що ви пишете в /dev/null, відправляється в порожнечу і забувається (іншими словами, чорна діра). Щоб зрозуміти, чому це корисно, ви повинні спочатку мати базове уявлення про стандартний потік виводу даних (stdout) та стандартний потік виводу помилок (stderr).

stdout та stderr

Щоразу, коли запускається будь-яка утиліта командного рядка, вона генерує два типи виводу: стандартний вивід виконання команди відправляється в stdout, а повідомлення про помилки (якщо такі є) — в stderr.

За замовчуванням stdout та stderr пов’язані з вікном терміналу. Це означає, що все, що відправляється в stdout і stderr, зазвичай відображається на екрані. Але за допомогою перенаправлення виводу ми можемо змінити цю поведінку. Наприклад, ми можемо перенаправити вивід stdout у файл. Таким чином, замість відображення інформації про виконання команди на екрані терміналу, її буде збережено у файлі, який ми пізніше зможемо прочитати. Або ж можна перенаправити stdout на фізичний пристрій, скажімо, на цифровий РК-дисплей.

У Linux-системах stdout має файловий дескриптор 1, а stderr — файловий дескриптор 2. Використовуючи дані дескриптори, ми можемо перенаправляти вивід з stdout та stderr до інших файлів:

   1> використовується для перенаправлення стандартного виводу даних (stdout);

   2> використовується для перенаправлення виводу повідомлень про помилки (stderr). Наприклад, 2>/dev/null відправляє повідомлення про помилки в “чорну діру”, а 2>/home/user/error.log — в файл error.log.

   &> використовується для перенаправлення як стандартного виводу даних (stdout), так і виводу повідомлень про помилки (stderr).

/dev/null як спосіб позбутися непотрібного виводу

Припустимо, що нам потрібно знайти файли в каталозі /sys, які відносяться до налаштувань живлення:

grep -r power /sys/

У виводі команди буде багато файлів, які звичайний користувач (не root) не зможе прочитати (ми отримаємо повідомлення про помилку “Відмовлено в доступі”). Ці повідомлення захаращують термінал і ускладнюють пошук. Оскільки помилки “Відмовлено в доступі” є частиною stderr, то ми можемо перенаправити їх у “чорну діру”, використовуючи /dev/null:

grep -r power /sys/ 2>/dev/null

Як ви можете бачити, тепер результат сприймається набагато простіше.

В інших випадках може бути корисно зробити зворотне: відфільтрувати стандартний вивід, щоб ми могли бачити лише помилки, наприклад:

ping ravesli.com 1>/dev/null

На скріншоті показано, що без перенаправлення команда ping відображає свій звичайний вивід. У другій команді нічого не відображається, поки мережа підключена, але як тільки вона вимикається, виводиться (тільки) повідомлення про помилку.

Ми можемо перенаправити як stdout, так і stderr у два різні місця:

ping google.com 1>/dev/null 2>error.log

У цьому випадку стандартний вивід виконання команди не відображатиметься зовсім, а повідомлення про помилки будуть збережені у файлі error.log.

Перенаправлення всього виводу в /dev/null

Іноді корисно позбутися всіх вихідних даних. Є два способи зробити це:

grep -r power /sys/ >/dev/null 2>&1

Частина >/dev/null означає “перенаправити дані з stdout в /dev/null», а частина 2>&1 означає “перенаправити дані з stderr в stdout”. Таким чином ми перенаправили весь вивід команди в порожнечу.

Примітка: В цьому випадку ми повинні посилатися на стандартний вивід (stdout) за допомогою знака амперсанда — &1, а не просто 1. Запис 2>1 перенаправить дані з stdout у файл з назвою 1.

Варто відзначити, що тут дуже важливий порядок: якщо ви зміните параметри перенаправлення наступним чином:

grep -r power /sys/ 2>&1 >/dev/null

…то це спрацює не так, як ви думаєте. Частина 2>&1 перенаправить stderr у stdout, відобразить вивід на екрані, після чого перенаправить stdout в /dev/null. Кінцевим результатом стане те, що замість шуканої інформації ви побачите повідомлення про помилки. Якщо ви не можете запам’ятати правильний порядок складових, є простіше перенаправлення:

grep -r power /sys/ &>/dev/null

У даному випадку &>/dev/null еквівалентно виразу “перенаправити як stdout, так і stderr в /dev/null”.

Додаткові приклади використання /dev/null

Припустимо, що ми хочемо подивитися, як швидко наш диск може зчитувати послідовні дані. Тест не дуже точний, але його цілком достатньо. Для цього ми можемо використати команду dd. За допомогою of=/dev/null ми можемо вказати команді dd, що дані слід надсилати в /dev/null. Параметр if= вказує розташування файлу-джерела, з якого будуть зчитуватися дані:

dd if=<файл-джерело> of=/dev/null status=progress bs=1M iflag=direct

Інший приклад: припустимо, що у нас з’явилося бажання перевірити, як швидко завантажуватиметься файл через наше мережеве з’єднання, але при цьому ми не хочемо без необхідності записувати дані на диск. Для цього достатньо вказати /dev/null як ім’я файлу, що зберігається:

wget -O /dev/null https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.1.0-amd64-netinst.iso

Висновки

/dev/null — це файл віртуального пристрою, який при записі до нього все відправляє в порожнечу, а при читанні з нього зчитує нуль. Справжній потенціал /dev/null досить чудово розкривається у різних bash-сценаріях.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (5 оцінок, середня: 5,00 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *