Перейти к содержимому

Dev null что это

  • автор:

Dev null что это

Псевдоустройство /dev/null — это, своего рода, «черная дыра» в системе. Это, пожалуй, самый близкий смысловой эквивалент. Все, что записывается в этот файл, «исчезает» навсегда. Попытки записи или чтения из этого файла не дают, ровным счетом, никакого результата. Тем не менее, псевдоустройство /dev/null вполне может пригодиться.

Подавление вывода на stdout.

cat $filename >/dev/null # Содержимое файла $filename не появится на stdout.
rm $badname 2>/dev/null # Сообщение об ошибке "уйдет в никуда".

Подавление вывода, как на stdout, так и на stderr.

cat $filename 2>/dev/null >/dev/null # Если "$filename" не будет найден, то вы не увидите сообщения об ошибке. # Если "$filename" существует, то вы не увидите его содержимое. # Таким образом, вышеприведенная команда ничего не выводит на экран. # # Такая методика бывает полезной, когда необходимо лишь проверить код завершения команды #+ и нежелательно выводить результат работы команды на экран. # # cat $filename &>/dev/null # дает тот же результат, автор примечания Baris Cicek.
cat /dev/null > /var/log/messages # : > /var/log/messages дает тот же эффект, но не порождает дочерний процесс. cat /dev/null > /var/log/wtmp

Автоматическая очистка содержимого системного журнала (logfile) (особенно хороша для борьбы с надоедливыми рекламными идентификационными файлами ( «cookies» )):

Пример 28-1. Удаление cookie-файлов

if [ -f ~/.netscape/cookies ] # Удалить, если имеются. then rm -f ~/.netscape/cookies fi ln -s /dev/null ~/.netscape/cookies # Теперь, все cookie-файлы, вместо того, чтобы сохраняться на диске, будут "вылетать в трубу".

Пример 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero

#!/bin/bash # Создание файла подкачки. # Этот сценарий должен запускаться с правами root. ROOT_UID=0 # Для root -- $UID 0. E_WRONG_USER=65 # Не root? FILE=/swap BLOCKSIZE=1024 MINBLOCKS=40 SUCCESS=0 if [ "$UID" -ne "$ROOT_UID" ] then echo; echo "Этот сценарий должен запускаться с правами root."; echo exit $E_WRONG_USER fi blocks=$ # По-умолчанию -- 40 блоков, #+ если размер не задан из командной строки. # Ниже приводится эквивалентный набор команд. # -------------------------------------------------- # if [ -n "$1" ] # then # blocks=$1 # else # blocks=$MINBLOCKS # fi # -------------------------------------------------- if [ "$blocks" -lt $MINBLOCKS ] then blocks=$MINBLOCKS # Должно быть как минимум 40 блоков. fi echo "Создание файла подкачки размером $blocks блоков (KB)." dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # "Забить" нулями. mkswap $FILE $blocks # Назначить как файл подкачки. swapon $FILE # Активировать. echo "Файл подкачки создан и активирован." exit $SUCCESS

Пример 28-3. Создание электронного диска

#!/bin/bash # ramdisk.sh # "электронный диск" -- это область в ОЗУ компьютера #+ с которой система взаимодействует как с файловой системой. # Основное преимущество -- очень высокая скорость чтения/записи. # Недостатки -- энергозависимость, уменьшение объема ОЗУ, доступного системе, # относительно небольшой размер. # # Чем хорош электронный диск? # При хранении наборов данных, таких как таблиц баз данных или словарей, на электронном диске #+ вы получаете высокую скорость работы с этими наборами, поскольку время доступа к ОЗУ # неизмеримо меньше времени доступа к жесткому диску. E_NON_ROOT_USER=70 # Сценарий должен запускаться с правами root. ROOTUSER_NAME=root MOUNTPT=/mnt/ramdisk SIZE=2000 # 2K блоков (измените, если это необходимо) BLOCKSIZE=1024 # размер блока -- 1K (1024 байт) DEVICE=/dev/ram0 # Первое устройство ram username=`id -nu` if [ "$username" != "$ROOTUSER_NAME" ] then echo "Сценарий должен запускаться с правами root." exit $E_NON_ROOT_USER fi if [ ! -d "$MOUNTPT" ] # Проверка наличия точки монтирования, then #+ благодаря этой проверке, при повторных запусках сценария mkdir $MOUNTPT #+ ошибки возникать не будет. fi dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # Очистить электронный диск. mke2fs $DEVICE # Создать файловую систему ext2. mount $DEVICE $MOUNTPT # Смонтировать. chmod 777 $MOUNTPT # Сделать электронный диск доступным для обычных пользователей. # Но при этом, только root сможет его отмонтировать. echo "Электронный диск \"$MOUNTPT\" готов к работе." # Теперь электронный диск доступен для любого пользователя в системе. # Внимание! Электронный диск -- это энергозависимое устройство! Все данные, хранящиеся на нем, #+ будут утеряны при остановке или перезагрузке системы. # Если эти данные представляют для вас интерес, то сохраняйте их копии в обычном каталоге. # После перезагрузки, чтобы вновь создать электронный диск, запустите этот сценарий. # Простое монтирование /mnt/ramdisk, без выполнения подготовительных действий, не будет работать. exit 0
Назад К началу Вперед
/proc Наверх Отладка сценариев

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

/dev/null в Linux — это файл нулевого устройства. Он удаляет все записанное в него и возвращает при чтении EOF ( End of File) .

Проще говоря, это такой специальный хак командной строки, который действует как пылесос — затягивает все, что ему брошено.

Давайте посмотрим, что это значит на практике и что мы можем сделать с этим файлом.

Свойства /dev/null

Следующая команда cat вернет символ конца файла (EOF), если вы попытаетесь прочитать его с ее помощью.

Валидность файла можно проверить с помощью:

Данная команда вернет:

 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 — а это не то, что нам нужно.

Что означает «> /dev/null 2>&1» или перенаправление STDIN, STDOUT и STDERR?

Существует три стандартных значения ввода и вывода для программ (их можно представить как «потоки данных», они пришли из языка программирования C).

STDIN — ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.

STDOUT — вывод результат программы обычно печатается в стандартной вывод
STDERR — вывод сообщений об ошибках

Часто к ним обращаются не по имени, а по номеру (по умолчанию, если не указать номер, подразумеваться STDOUT): 0 — STDIN, 1 — STDOUT и 2 — STDERR.

Когда программа начинает выполняться, автоматически открываются пять потоков: стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и стандартное устройство печати (stdprn).

Оператор > («больше чем»), переадресовывает вывод программы.
/dev/null & выполнение в фоне

/dev/null && после выполнения без ошибок выполнить следующую коменду

[command] & — запускает команду в фоне, т.е. управление отдаётся командному интерпретатору (bash, например), а [command] будет выполняться «параллельно».

[command] && — подразумевает, что следующая команда будет выполнена только в том случае, если [command] была выполнена успешна (вернула 0).

Пример. Если нужно получить вывод скрипта и никаких ошибок: 2>/dev/null

*/10 * * * * root /var/www/jobs/cronload.sh > /dev/null 2>/dev/null

Пример. Использование планировщика cron в Linux. Если нужно получать только сообщения об ошибках: > /dev/null

*/10 * * * * root /var/www/jobs/cronload.sh > /dev/null

Пример. Использование планировщика cron в Linux. Если нужно весь вывод указанной команды удалить, то есть даже при ошибках скрипт будет молчать.

*/10 * * * * root /var/www/jobs/cronload.sh > /dev/null 2>&1

Инглекс (Englex) — онлайн школа английского языка.

11 Самых Популярных Статей

  1. ulimit (limits.conf) управление ограничениями ресурсов ОС Linux
  2. 7 способов сравнения файлов по содержимому в Windows или Linux
  3. Что такое страны tier 1,2,3 и как правильно выбрать ГЕО для рекламной кампании
  4. Настройка, использование GitLab CI/CD
  5. Что означает «> /dev/null 2>&1» или перенаправление STDIN, STDOUT и STDERR?
  6. Настройка и использование сервера OpenVPN в Linux
  7. PostgreSQL: создать БД, пользователя, таблицу, установить права
  8. Виды кодировок символов
  9. Использование rsync в примерах
  10. my.cnf примеры конфигурации MySQL, MariaDB
  11. dig проверка DNS сервера

11 Самых Популярных Обзоров

  1. ТОП 4 лучших антидетект браузеров в 2023 (Бесплатные & Платные)
  2. Обзор и отзывы о Namecheap в 2023 году
  3. Хостинг Zomro (Зомро)
  4. Обзор браузера Dolphin
  5. ТОП 3 Проверенных VPN, Прокси, Хостинг VPS Турция в 2023
  6. Что такое абузоустойчивый хостинг (bulletproof)?
  7. Обзор и отзывы о 4VPS (FourServer) в 2023 году
  8. Обзор и отзывы AstroProxy в 2023 году
  9. Обзор и отзывы о PQ Hosting в 2023 году
  10. Обзор и отзывы о Hostinger в 2023 году: преимущества и недостатки
  11. Проверенные VPS / VDS хостинг провайдеры

Что такое /dev/null и как его использовать в Bash

Linux — это интересная операционная система, в которой размещены некоторые виртуальные устройства для различных целей. Для программ, работающих в системе, эти виртуальные устройства действуют так, как будто это реальные файлы. Инструменты могут запрашивать и получать данные из этих источников. Данные генерируются ОС вместо того, чтобы считывать их с диска. Одним из таких примеров является /dev/null . Это специальный файл, который присутствует в каждой системе Linux. Однако, в отличие от большинства других виртуальных файлов, вместо чтения он используется для записи. Все, что вы запишете в /dev/null , будет отброшено, забыто в пустоте. В системе UNIX он известен как нулевое устройство. Зачем вам выбрасывать что-то в пустоту? Давайте посмотрим, что такое /dev/null и как он используется.

Оглавление:

  • Предварительно
  • Использование /dev/null
  • Перенаправление вывода в /dev/null
  • Перенаправить весь вывод в /dev/null
  • Другие примеры

Предварительно

Прежде чем углубиться в использование /dev/null , мы должны иметь четкое представление о потоке данных stdout и stderr . Ознакомьтесь с этим коротким руководством по stdin, stderr и stdout.

Давайте сделаем небольшое уточнение. При запуске любой утилиты командной строки она генерирует два вывода. Вывод идет на stdout , а ошибка (если она возникла) — на stderr . По умолчанию оба этих потока данных связаны с терминалом.

Например, следующая команда выведет строку, заключенную в двойные кавычки. Здесь вывод сохраняется в stdout .

$ echo "Hello World"

Следующая команда покажет нам статус выхода ранее запущенной команды.

$ echo $?

Поскольку предыдущая команда была выполнена успешно, статус выхода равен 0. В противном случае статус выхода будет другим. Что произойдет, если вы попытаетесь выполнить недопустимую команду?

$ adfadsf $ echo $?

Теперь нам нужно разобраться в файловом дескрипторе. В экосистеме UNIX это целочисленные значения, присвоенные файлу. И stdout , и stderr имеют определенный дескриптор файла: stdout = 1 , stderr = 2 . Используя дескриптор файла (1 и 2), мы можем перенаправить stdout и stderr в другие файлы.

Cледующий пример перенаправит stdout команды echo в текстовый файл. Здесь мы не указали дескриптор файла. Если он не указан, bash будет использовать stdout по умолчанию.

$ echo "Hello World" > log.txt

Следующая команда перенаправит stderr в текстовый файл.

$ asdfadsa 2> error.txt

Использование /dev/null

Перенаправление вывода в /dev/null

Теперь мы готовы узнать, как использовать /dev/null . Сначала давайте проверим, как фильтровать обычный вывод и ошибки. В следующей команде grep попытается найти строку (hello, в данном случае) в каталоге «/sys».

$ grep -r hello /sys/

Однако это вызовет множество ошибок, поскольку без привилегий root grep не может получить доступ к ряду файлов. В этом случае он выдаст ошибку «Permission denied». Теперь, используя перенаправление, мы можем получить более четкий результат.

$ grep -r hello /sys/ 2> /dev/null

Вывод выглядит намного лучше, верно? Ничего! В этом случае у grep нет доступа ко многим файлам, а в тех, что есть, нет строки «hello».

В следующем примере мы будем пинговать Google.

$ ping google.com

Однако мы не хотим видеть все эти успешные результаты пинга. Вместо этого мы хотим сосредоточиться только на ошибках, когда ping не смог достичь Google. Как нам это сделать?

$ ping google.com 1> /dev/null

Здесь содержимое stdout сбрасывается в /dev/null , оставляя только ошибки.

Перенаправить весь вывод в /dev/null

В некоторых ситуациях вывод может оказаться бесполезным. Используя перенаправление, мы можем сбросить весь вывод в пустоту.

$ grep -r hello /sys/ > /dev/null 2>&1

Давайте немного разобьем эту команду. Сначала мы сбрасываем весь stdout в /dev/null . Затем, во второй части, мы говорим bash отправить stderr в stdout . В этом примере выводить нечего. Однако, если вы запутались, вы всегда можете проверить, успешно ли выполнилась команда.

$ echo $?

Значение равно 2, потому что команда выдала много ошибок.

Если вы склонны забывать файловый дескриптор stdout и stderr, следующая команда подойдет как нельзя лучше. Это более обобщенный формат предыдущей команды. И stdout, и stderr будут перенаправлены в /dev/null.

$ grep -r hello /sys/ &> /dev/null

Другие примеры

Это интересный пример. Знаете инструмент dd ? Это мощный инструмент для преобразования и копирования файлов. Узнайте больше о dd . Используя dd , мы можем проверить скорость последовательного чтения вашего диска. Конечно, это не точное измерение. Однако для быстрого теста это довольно полезно.

$ dd if= of=/dev/null status=progress bs=1M iflag=direct

Здесь я использовал Ubuntu 18.04.4 ISO в качестве большого файла.

Аналогичным образом вы также можете проверить скорость загрузки вашего интернет-соединения.

$ wget -O /dev/null

Надеемся, у вас есть четкое понимание того, что такое файл /dev/null. Это специальное устройство, которое при записи в него отбрасывает, а при чтении из него считывает null. Истинный потенциал этой интересной возможности заключается в интересных bash-скриптах.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *