Чтение онлайн

на главную - закладки

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

# При хранении наборов данных, таких как таблиц баз данных или словарей, на электронном диске

#+ вы получаете высокую скорость работы с этими наборами, поскольку время доступа к ОЗУ

# неизмеримо меньше времени доступа к жесткому диску.

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 ] . Синтаксические ошибки или опечатки часто вызывают сообщения об ошибках, которые которые практически никак не помогают при отладке.

59

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

Пример 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'. Однако, существует более простой способ выполнить эту задачу.

# Правильный способ удаления файлов, в чьих именах содержатся пробелы.

rm *\ *

rm *" "*

rm *' '*

# Спасибо S.C.

В общих чертах, ошибочными можно считать такие сценарии, которые

1. "сыплют" сообщениями о "синтаксических ошибках" или

2. запускаются, но работают не так как ожидалось (логические ошибки).

3. запускаются, делают то, что требуется, но имеют побочные эффекты (логическая бомба).

Инструменты, которые могут помочь при отладке неработающих сценариев

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

2. команда-фильтр tee, которая поможет проверить процессы и потоки данных в критических местах.

3. ключи -n -v -x

sh -n scriptname– - проверит наличие синтаксических ошибок, не запуская сам сценарий. Того же эффекта можно добиться, вставив в сценарий команду set -n или set -o noexec. Обратите внимание, некоторые из синтаксических ошибок не могут быть выявлены таким способом.

Поделиться:
Популярные книги

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая