Литвек - электронная библиотека >> Мендель Купер >> Другие языки и системы программирования и др. >> Искусство программирования на языке сценариев командной оболочки >> страница 2
/var/log

cat /dev/null > messages

cat /dev/null > wtmp

echo "Лог-файлы очищены."

Здесь нет ничего необычного, это простая последовательность команд, которая может быть набрана в командной строке с консоли или в xterm. Преимущество размещения последовательности команд в скрипте состоит в том, что вам не придется всякий раз набирать эту последовательность вручную. Кроме того, скрипты легко могут быть модифицированы или обобщены для разных применений.

(обратно)

Пример 2-2. cleanup: Расширенная версия предыдущего сценария.

#!/bin/bash

# cleanup, version 2

# Для работы сценария требуются права root.


LOG_DIR=/var/log

ROOT_UID=0 # Только пользователь с $UID 0 имеет привилегии root.

LINES=50 # Количество сохраняемых строк по-умолчанию.

E_XCD=66 # Невозможно сменить каталог?

E_NOTROOT=67 # Признак отсутствия root-привилегий.


if [ "$UID" -ne "$ROOT_UID" ]

then

echo "Для работы сценария требуются права root."

exit $E_NOTROOT

fi


if [ -n "$1" ]

# Проверка наличия аргумента командной строки.

then

lines=$1

else

lines=$LINES # Значение по-умолчанию, если число не задано в командной строке

fi


# Stephane Chazelas предложил следующее,

#+ для проверки корректности аргумента, переданного из командной строки,

#+ правда это достаточно сложно для данного руководства.

#

# E_WRONGARGS=65 # Не числовой аргумент

#

# case "$1" in

# "" ) lines=50;;

# *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;

# * ) lines=$1;;

# esac

#

#* Конец проверки корректности аргумента


cd $LOG_DIR


if [ `pwd` != "$LOG_DIR" ] # или if [ "$PWD" != "$LOG_DIR" ]

# Не в /var/log?

then

echo "Невозможно перейти в каталог $LOG_DIR."

exit $E_XCD

fi # Проверка каталога перед очисткой лог-файлов.


# более эффективный вариант:

#

# cd /var/log || {

# echo "Невозможно перейти в требуемый каталог." >&2

# exit $E_XCD;

# }


tail -$lines messages > mesg.temp # Сохранить последние строки в лог-файле.

mv mesg.temp messages


# cat /dev/null > messages

#* Необходимость этой команды отпала, поскольку очистка выполняется выше.


cat /dev/null > wtmp # команды ': > wtmp' и '> wtmp' имеют тот же эффект.

echo "Лог-файлы очищены."


exit 0

# Возвращаемое значение 0

#+ указывает на успешное завершение работы сценария.

Если вы не желаете полностью вычищать системные логи, то выше представлена улучшенная версия предыдущего сценария. Здесь сохраняются последние несколько строк (по-умолчанию -- 50).

Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария. Это двухбайтовая последовательность, или[ 4 ] -- специальный маркер, определяющий тип сценария, в данном случае -- сценарий командной оболочки (см. man magic). Более точно, sha-bang определяет интерпретатор, который вызывается для исполнения сценария, это может быть командная оболочка (shell), иной интерпретатор или утилита[ 5 ].

#!/bin/sh

#!/bin/bash

#!/usr/bin/perl

#!/usr/bin/tcl

#!/bin/sed -f

#!/usr/awk -f


Каждая, из приведенных выше сигнатур, приводит к вызову различных интерпретаторов, будь то /bin/sh -- командный интерпретатор по-умолчанию (bash для Linux-систем), либо иной[ 6 ]. При переносе сценариев с сигнатурой #!/bin/sh на другие UNIX системы, где в качестве командного интерпретатора задан другой shell, вы можете лишиться некоторых особенностей, присущих bash. Поэтому такие сценарии должны быть POSIX совместимыми[ 7 ].

Обратите внимание на то, что сигнатура должна указывать правильный путь к интерпретатору, в противном случае вы получите сообщение об ошибке -- как правило это "Command not found".

Сигнатура #! может быть опущена, если вы не используете специфичных команд. Во втором примере (см. выше) использование сигнатуры #! обязательно, поскольку сценарий использует специфичную конструкцию присваивания значения переменной lines=50. Еще раз замечу, что сигнатура #!/bin/sh вызывает командный интерпретатор по-умолчанию -- /bin/bash в Linux-системах.

Искусство программирования на языке сценариев командной оболочки. Иллюстрация № 1 В данном руководстве приветствуется модульный подход к построению сценариев. Записывайте, собирайте свою коллекцию участков кода, который может вам встретиться. В конечном итоге вы соберете свою "библиотеку" подпрограмм, которые затем сможете использовать при написании своих сценариев. Например, следующий отрывок сценария проверяет количество аргументов в командной строке:

if [ $# -ne Number_of_expected_args ]

then

echo "Usage: `basename $0` whatever"

exit $WRONG_ARGS

fi


(обратно) (обратно)

2.1. Запуск сценария

Запустить сценарий можно командой sh scriptname[ 8 ] или bash scriptname. (Не рекомендуется запуск сценария командой sh <scriptname>, поскольку это запрещает использование устройства стандартного ввода stdin в скрипте). Более удобный вариант -- сделать файл скрипта исполняемым, командой chmod.

Это:

chmod 555 scriptname (выдача прав на чтение/исполнение любому пользователю в системе)[ 9 ]

или

chmod +rx scriptname (выдача прав на чтение/исполнение любому пользователю в системе)

chmod u+rx scriptname (выдача прав на чтение/исполнение только "владельцу" скрипта)


После того, как вы сделаете файл сценария исполняемым, вы можете запустить его примерно такой командой ./scriptname.[ 10 ] Если, при этом, текст сценария начинается с корректной сигнатуры ("sha-bang"), то для его исполнения будет вызван соответствующий интерпретатор.

И наконец, завершив отладку сценария, вы можете поместить его в каталог /usr/local/bin (естественно, что для этого вы должны обладать правами root), чтобы сделать его доступным для себя и других пользователей системы. После этого сценарий можно вызвать, просто напечатав название файла в командной строке и нажав клавишу [ENTER].


(обратно)

2.2. Упражнения

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

2. Напишите сценарий, который выводит дату, время, список зарегистрировавшихся пользователей, и uptime системы и сохраняет эту информацию в системном журнале.

(обратно) (обратно) (обратно)

Часть 2. Основы

Глава 3. Служебные символы

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

#

Комментарии. Строки, начинающиеся с символа # (за исключением комбинации #!) -- являются комментариями.

# Эта строка -- комментарий.


Комментарии могут располагаться и в конце строки с исполняемым кодом.

echo "Далее следует комментарий." # Это комментарий.


Комментариям могут предшествовать пробелы (пробел, табуляция).

# Перед комментарием стоит символ табуляции.


Искусство программирования на языке сценариев командной</div></main></div><div class='read_navi'><form class='sec_tab' action='/br/125099' method='get'><label>Страница: <input size='3' class='mz5 p5 s09' type='text' name='p' value='2'></label><input class='mz5 fff s11' style='border:0px' type='submit' value='GO'></form><ul style=
  • 1
  • 2
  • 3
  • 4
  • . . .
  • последняя (108) »
  • ЛитВек: бестселлеры месяца
    Бестселлер - Элизабет Гилберт - Есть, молиться, любить - читать в ЛитвекБестселлер - Андрей Валентинович Жвалевский - Время всегда хорошее - читать в ЛитвекБестселлер - Розамунда Пилчер - В канун Рождества - читать в ЛитвекБестселлер - Олег Вениаминович Дорман - Подстрочник: Жизнь Лилианны Лунгиной, рассказанная ею в фильме Олега Дормана - читать в ЛитвекБестселлер - Джон Перкинс - Исповедь экономического убийцы - читать в ЛитвекБестселлер - Людмила Евгеньевна Улицкая - Казус Кукоцкого - читать в ЛитвекБестселлер - Наринэ Юрьевна Абгарян - Манюня - читать в ЛитвекБестселлер - Мария Парр - Вафельное сердце - читать в Литвек