Выбрать главу

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

Глава 29. Отладка сценариев

Командная оболочка Bash не имеет своего отладчика, и не имеет даже каких либо отладочных команд или конструкций[ 59 ]. Синтаксические ошибки или опечатки часто вызывают сообщения об ошибках, которые которые практически никак не помогают при отладке.

Пример 29-1. Сценарий, содержащий ошибку

#!/bin/bash

# ex74.sh

# Этот сценарий содержит ошибку.

a=37

if [$a -gt 27 ]

then

echo $a

fi

exit 0

В результате исполнения этого сценария вы получите такое сообщение:

./ex74.sh: [37: command not found

Что в этом сценарии может быть неправильно (подсказка: после ключевого слова if)?

Пример 29-2. Пропущено ключевое слово

#!/bin/bash

# missing-keyword.sh:

# Какое сообщение об ошибке будет выведено, при попытке запустить этот сценарий?

for a in 1 2 3

do

echo "$a"

# done # Необходимое ключевое слово 'done' закомментировано.

exit 0

На экране появится сообщение:

missing-keyword.sh: line 11: syntax error: unexpected end of file

Обратите внимание, сообщение об ошибке будет содержать номер не той строки, в которой возникла ошибка, а той, в которой Bash точно установил наличие ошибочной ситуации.

Сообщения об ошибках могут вообще не содержать номера строки, при исполнении которой эта ошибка появилась.

А что делать, если сценарий работает, но не так как ожидалось? Вот пример весьма распространенной логической ошибки.

Пример 29-3. test24

#!/bin/bash

# Ожидается, что этот сценарий будет удалять в текущем каталоге

#+ все файлы, имена которых содержат пробелы.

# Но он не работает. Почему?

badname=`ls | grep ' '`

# echo "$badname"

rm "$badname"

exit 0

Попробуйте найти ошибку, раскомментарив строку echo "$badname". Инструкция echo очень полезна при отладке сценариев, она позволяет узнать -- действительно ли вы получаете то, что ожидали получить.

В данном конкретном случае, команда rm "$badname" не дает желаемого результата потому, что переменная $badname взята в кавычки. В результате, rm получает единственный аргумент (т.е. команда будет считать, что получила имя одного файла). Частично эта проблема может быть решена за счет удаления кавычек вокруг $badname и установки переменной $IFS так, чтобы она содержала только символ перевода строки, IFS=$'\n'. Однако, существует более простой способ выполнить эту задачу.

вернуться

59

Bash debugger (автор: Rocky Bernstein) частично возмещает этот недостаток.