Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки | ||
---|---|---|
Назад | Вперед |
Псевдоустройство /dev/null -- это, своего рода, "черная дыра" в системе. Это, пожалуй, самый близкий смысловой эквивалент. Все, что записывается в этот файл, "исчезает" навсегда. Попытки записи или чтения из этого файла не дают, ровным счетом, никакого результата. Тем не менее, псевдоустройство /dev/null вполне может пригодиться.
Подавление вывода на stdout.
cat $filename >/dev/null # Содержимое файла $filename не появится на stdout.
Подавление вывода на stderr (from Пример 12-2).
rm $badname 2>/dev/null # Сообщение об ошибке "уйдет в никуда".
Подавление вывода, как на stdout, так и на stderr.
cat $filename 2>/dev/null >/dev/null # Если "$filename" не будет найден, то вы не увидите сообщения об ошибке. # Если "$filename" существует, то вы не увидите его содержимое. # Таким образом, вышеприведенная команда ничего не выводит на экран. # # Такая методика бывает полезной, когда необходимо лишь проверить код завершения команды #+ и нежелательно выводить результат работы команды на экран. # # cat $filename &>/dev/null # дает тот же результат, автор примечания Baris Cicek.
Удаление содержимого файла, сохраняя, при этом, сам файл, со всеми его правами доступа (очистка файла) (из Пример 2-1 и Пример 2-2):
cat /dev/null > /var/log/messages # : > /var/log/messages дает тот же эффект, но не порождает дочерний процесс. cat /dev/null > /var/log/wtmp
Автоматическая очистка содержимого системного журнала (logfile) (особенно хороша для борьбы с надоедливыми рекламными идентификационными файлами ("cookies")):
Подобно псевдоустройству /dev/null, /dev/zero так же является псевдоустройством, с той лишь разницей, что содержит нули. Информация, выводимая в этот файл, так же бесследно исчезает. Чтение нулей из этого файла может вызвать некоторые затруднения, однако это можно сделать, к примеру, с помощью команды od или шестнадцатиричного редактора. В основном, /dev/zero используется для создания заготовки файла с заданой длиной.
Пример 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=${1:-$MINBLOCKS} # По-умолчанию -- 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
Еще одна область применения /dev/zero -- "очистка" специального файла заданного размера, например файлов, монтируемых как loopback-устройства (см. Пример 13-6) или для безопасного удаления файла (см. Пример 12-42).
Пример 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