Після засвоєння цього розділу ви зможете:
- писати прості сценарії
- визначати тип оболонки, що має виконувати сценарій
- записувати в сценарій коментарії
- змінювати права доступу для сценарію
- виконувати та доладжувати сценарій
Створення та запуск сценарію
Написання та називання сценаріїв
Сценарій оболонки — це послідовність команд, розрахована для багаторазового вжитку. Зазвичай для виконання цієї послідовності назву сценарію вводять у командному рядку. Сценарії також можна застосувати для автоматизації задач, використовуючи можливості інструменту cron. Ще один приклад — завантаження та зупинка систем UNIX, під час яких у спеціальних сценаріях визначаються набори демонів та служб, які потрібно запустити або вимкнути.
Аби створити сценарій, відкрийте новий порожній файл у вашому улюбленому редакторі — vim, emacs, gedit, kate чи будь-якому іншому. Можливо, ви захочете використовувати багатші на можливості vim чи emacs, оскільки вони, наприклад, можуть бути налаштовані таким чином, щоб розпізнавати та підсвітлювати синтаксис оболонки, що допоможе уникати помилок, які часто роблять початківці — як, наприклад, пропуск дужок чи розділювачів.
Введіть команди UNIX в новий порожній файл — так само, як ви вводите їх у командному рядку. Як було сказано в попередньому розділі (див параграф 1.3), команди можуть бути функціями оболонки, вбудованими командами оболонки, командами UNIX чи іншими сценаріями.
Дайте своєму сценарію зрозумілу назву, яка підказуватиме, що він робить. Переконайтеся, що нова назва не конфліктує з наявними командами. Задля впевненості в тому, що плутанини не буде, назви сценаріїв часто закінчують на .sh; та навіть у такому випадку буває, що в системі є сценарій із такою назвою. Перевірте це за допомогою ?which, ?whereis та інших команд, призначених для пошуку інформації про програми та файли:
which -a script_name
whereis script_name
locate script_name
script1.sh
В цьому прикладі ми використовуватимемо вбудовану команду echo, аби повідомляти користувача про те, що ми збираємось робити. Наполегливо радиться робити це, щоб користувачі не нервувались, буцімто «сценарій нічого не робить». Ми повернемось до питання інформування користувача в розділі 8.
Мал. 2-1. script1.sh
Введіть і собі цей сценарій. Було б непогано створити каталог ~/scripts для того, щоб зберігати там усі ваші сценарії. Додайте цей каталог до вмісту змінної оточення PATH:
export PATH="$PATH:~/scripts"
Якщо ви тільки-но розпочали знайомство з bash, використовуйте текстовий редактор, котрий застосовує різні кольори для різних конструкцій оболонки. Підсвічування синтаксису підтримується vim, gvim, (x)emacs, kwrite та багатьма іншими редакторами; перевірте документацію вашого улюбленого редактора щодо цього.
Примітка: Різні підказки
Зауважте, що вигляд підказки залежить від смаків користувача. В реальному житті набагато зручніше використовувати ще щось окрім навчального $. Єдине, чого ми дотримуватимемось твердо — це наявність символу ґратки в підказці користувача root.
Виконання сценарію
Для того, щоб бути запущеним, сценарій повинен мати відповідні права доступу. Встановлюючи їх перевірте, що ви встановили саме ті права, що потрібно. Після цього сценарій може бути запущений як і будь-яка інша команда:
willy:~/scripts> chmod u+x script1.sh
willy:~/scripts> ls -l script1.sh
-rwxrw-r-- 1 willy willy 456 Dec 24 17:11 script1.sh
willy:~> script1.sh
Сценарій запустився.
Привіт, willy!
Зараз я покажу тобі список приєднаних користувачів:
3:38pm up 18 days, 5:37, 4 users, load average: 0.12, 0.22, 0.15
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 - Sat 2pm 4:25m 0.24s 0.05s -bash
willy :0 - Sat 2pm ? 0.00s ? -
willy pts/3 - Sat 2pm 3:33m 36.39s 36.39s BitchX willy ir
willy pts/2 - Sat 2pm 3:33m 0.13s 0.06s /usr/bin/screen
Тепер я встановлюю дві змінні.
Ось ланцюжок: black
А ось число: 9
Тепер повертаю тобі твою підказку.
willy:~/scripts> echo $COLOUR
willy:~/scripts> echo $VALUE
willy:~/scripts>
Це найуживаніший спосіб запуску сценаріїв. Сценарії такого ґатунку, як правило, виконуються в дочірній оболонці. Змінні, функції та псевдоніми, зареєстровані в цій оболонці, відносяться тільки до поточної оболонки та втрачають свою вагу після її завершення. Якщо ви не вставили каталог ~/scripts в змінну PATH і . (поточний каталог) також відсутній в ній^dotpath, ви можете запустити ваш сценарій наприклад так:
./script_name.sh
Сценарій може також бути запущеним з явним вказуванням імені оболонки, але як правило ми це робимо лише в тому випадку, коли хочемо перевірити поведінку сценарію в певній оболонці:
rbash script_name.sh
sh script_name.sh
bash -x script_name.sh
Визначена оболонка буде запущена як дочірня відносно поточної та виконає сценарій. Це робиться, якщо ви хочете запустити сценарій з певними опціями чи в певних умовах, що не визначаються всередині сценарію.
Якщо ж ви не хочете запускати нову копію оболонки, а запустити сценарій у поточній, ви можете зробити це з допомогою команди source:
source script_name.sh
В цьому випадку сценарій не потребує прав на виконання. Команди виконуються в поточному оточенні оболонки, так що всі внесені зміни будуть стосуватись поточної оболонки:
Підказка: source = .
Вбудована команда bash «source» є аналогом вбудованої команди оболонки sh «. » (крапка).
willy:~/scripts> source script1.sh
-- вивід покусано --
willy:~/scripts> echo $VALUE
9
willy:~/scripts>
Основи сценарію
Яка оболонка запускатиме сценарій
Запускаючи сценарій у дочірній оболонці, ви повинні зазначити, яка саме оболонка буде його виконувати. Адже оболонка, в якій ви написали сценарій може й не бути основною у вашій системі і введені вами команди можуть призводити до помилок, якщо будуть виконуватись не в тій оболонці. Перший рядок сценарію визначає, яка саме оболонка буде його запускати. Перші два символи першого рядка повинні бути «#!», після яких йде повний шлях до оболонки, яка інтерпретуватиме команди. Зауважте, що порожні рядки також аналізуються і не починайте з них свого сценарію. З цією метою всі сценарії розпочинаються з рядка
#!/bin/bash
Як було зазначено вище, передбачається, що інтерпретатор Борна знаходиться в каталозі /bin
.
Додавання коментарів
Ви повинні знати, що ви можете бути не єдиною особою, що читає код вашого сценарію. Велика кількість користувачів та системних адміністраторів запускають сценарії, написані іншими. Якщо вони хочуть подивитись на їхню внутрішню будову, коментарі дуже спростять їм читання.
Коментарі також спрощують ваше власне життя. Наприклад, ви прочитали величезну кількість сторінок довідки для того, щоб досягти певного результату виконання команд, що використовуються у сценарії. Навряд чи ви пам'ятатимете, як вам це вдалось, коли вам потрібно буде змінити ваш сценарій через кілька тижнів чи місяців — якщо ви не напишете, що, як і для чого ви зробили.
Візьміть ваш приклад script1.sh та скопіюйте його до файлу commented-script1.sh, котрий ми змінимо таким чином, щоб робота сценарію пояснювалась коментарями. Все, що оболонка зустрічає після символу ґратки до кінця рядка, ігнорується:
#!/bin/bash
# Цей сценарій очищує термінал, друкує вітання та інформує
# про активних користувачів. Також як приклад задаються та показуються дві змінні.
clear# очистити вікно терміналу
echo "Сценарій запустився."
echo "Привіт, $USER!"#символ долара використовується щоб отримати значення змінної
echo
echo " Зараз я покажу тобі список приєднаних користувачів:"
echo
w# показати, хто зараз працює у системі
echo# та що він робить
echo " Тепер я встановлюю дві змінні."
COLOUR="black"# задати локальну змінну оболонки
VALUE="9"# задати локальну змінну оболонки
echo "Ось ланцюжок: $COLOUR"# показати вміст змінної
echo "А ось число: $VALUE"# показати вміст змінної
echo
echo " Тепер повертаю тобі твою підказку."
echo
В пристойному сценарії перші рядки завжди є коментарями про те, чого очікувати від сценарію. Окрім того, кожен блок команд для більшої ясності також коментується. До прикладу, стартові сценарії Linux в вашому системному каталозі init.d добре прокоментовані, щоб будь-який користувач Linux зміг їх прочитати та змінити.
Наладка сценаріїв Bash
Наладка всього сценарію
Якщо щось не хоче відбуватись відповідно до плану, вам потрібно дізнатись, що саме призводить до неправильної роботи сценарію. Bash пропонує обширні інструменти для наладки сценаріїв. Найбільш популярним є запустити дочірню оболонку з параметром -x, що запустить сценарій у режимі наладки. Сліди кожної команди та її аргументи виводяться на стандартний вивід після того, як вони проаналізовані але до запуску команди на виконання. Нижче наведено результат виконання сценарію commented-script1.sh в режимі наладки. Зауважте, що закоментованих рядків не видно у виводі сценарію.
willy:~/scripts> bash -x script1.sh
+ clear
+ echo ' Сценарій запустився.'
Сценарій запустився.
+ echo 'Привіт, willy!'
Привіт, willy!
+ echo
+ echo Зараз я покажу тобі список приєднаних користувачів:'
Зараз я покажу тобі список приєднаних користувачів:
+ echo
+ w
4:50pm up 18 days, 6:49, 4 users, load average: 0.58, 0.62, 0.40
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 - Sat 2pm 5:36m 0.24s 0.05s -bash
willy :0 - Sat 2pm ? 0.00s ? -
willy pts/3 - Sat 2pm 43:13 36.82s 36.82s BitchX willy ir
willy pts/2 - Sat 2pm 43:13 0.13s 0.06s /usr/bin/screen
+ echo
+ echo ' Тепер я встановлюю дві змінні.'
Тепер я встановлюю дві змінні.
+ COLOUR=black
+ VALUE=9
+ echo 'Ось ланцюжок: '
Ось ланцюжок:
+ echo 'А ось число: '
А ось число:
+ echo
+ echo 'Тепер повертаю тобі твою підказку.'
Тепер повертаю тобі твою підказку.
+ echo
Примітка: Майбутні властивості bash
На sourceforge зараз інтенсивно розвивається доладжувач для bash. Щоб його використовувати, вам потрібна латана (patched) версія bash версії 2.05. Починаючи з версії 3.0 нові функції наладки очікується включити до основної версії.
Наладка частини сценарію
Використовуючи вбудовану команду set, ви можете запускати ті частини сценарію, в роботі котрих впевнені, в нормальному режимі та виводити наладочну інформацію тільки для потенційно небезпечних частин сценарію. Скажімо, ми не впевнені в роботі команди w в сценарії commented-script1.sh, то ми можемо змінити сценарій наступним чином:
set -x# активувати режим наладки з цього місця
w
set +x# зупинити режим наладки
Тоді вивід сценарію виглядатиме наступним чином:
willy: ~/scripts> script1.sh
Сценарій запустився.
Привіт, willy!
Зараз я покажу тобі список приєднаних користувачів:
+ w
5:00pm up 18 days, 7:00, 4 users, load average: 0.79, 0.39, 0.33
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 - Sat 2pm 5:47m 0.24s 0.05s -bash
willy :0 - Sat 2pm ? 0.00s ? -
willy pts/3 - Sat 2pm 54:02 36.88s 36.88s BitchX willyke
willy pts/2 - Sat 2pm 54:02 0.13s 0.06s /usr/bin/screen
+ set +x
Тепер я встановлюю дві змінні.
Ось ланцюжок: black
А ось число: 9
Тепер повертаю тобі твою підказку.
willy: ~/scripts>
Ви можете вмикати та вимикати режим наладки в одному сценарії довільну кількість разів. Наведемо кілька найбільш вживаних опцій Bash:
set -f set -o noglob Блокувати генерацію імен файлів що містять метасимволи (globbing).
set -v set -o verbose Друкувати рядки сценарію таким чином як вони зчиталися.
set -x set -o xtrace Друкувати сліди команд до їх виконання.
Символ дефісу використовується як для установки так і для відміни кожної опції, не забувайте про це. В нижченаведеному прикладі ми продемонструємо ці опції у командному рядку:
willy:~/scripts> set -v
willy:~/scripts> ls
ls
commented-scripts.shscript1.sh
willy:~/scripts> set +v
set +v
willy:~/scripts> ls *
commented-scripts.sh script1.sh
willy:~/scripts> set -f
willy:~/scripts> ls *
ls: *: No such file or directory
willy:~/scripts> touch *
willy:~/scripts> ls
* commented-scripts.sh script1.sh
willy:~/scripts> rm *
willy:~/scripts> ls
commented-scripts.sh script1.sh
Ці опції можуть також бути встановлені у першому рядку сценарію. Опції можуть комбінуватись, як звичайно у UNIX системах:
#!/bin/bash -xv
Після того, як ви знайшли дефектну частину сценарію, ви можете поставити команди echo перед кожним рядком для того щоб точно бачити де й чому ваші команди не працюють. В прикладі сценарію commented-script1.sh це може бути зроблено наприклад таким чином:
echo "debug message: now attempting to start w command"; w
В складніших сценаріях echo може бути вставленим для відображення вмісту змінних в різних частинах сценарію для виявлення дефектів:
echo "Variable VARNAME is now set to $VARNAME."
Підсумок
Сценарії оболонки — це набір команд, записаний у текстовому файлі, доступному для виконання. Для редагування сценаріїв можна скористатись будь-яким текстовим редактором.
Сценарії розпочинаються з символів «#!», після яких іде повна назва оболонки, що запускатиме сценарій. Коментарі додаються в сценарій для майбутнього його використання, а також для зрозумілості іншим користувачам. Краще мати забагато пояснень, аніж не мати їх взагалі.
Доладжування сценаріїв може здійснюватись за допомогою ключів оболонки. Ключі також можуть використовуватись для часткового доладжування або аналізу сценарію. Вставка команд echo в ключових місцях також є поширеною технікою пошуку вад.
Вправи
Ця вправа допоможе вам написати ваш перший сценарій.
- Напишіть сценарій у вашому улюбленому редакторі. Цей сценарій повинен виводити шлях до вашого домашнього каталогу та тип терміналу, який ви використовуєте. Додатково він мав би показувати всі служби, що запукаються на третьому рівні запуску у вашій системі (підказка: використовуйте $HOME, $TERM та ls /etc/rc3.d/S*).
- Додайте коментарі у ваш сценарій.
- Додайте інформацію для користувачів, що будуть використовувати ваш сценарій.
- Змініть права доступу до сценарію таким чином, щоб його можна було виконувати.
- Запустіть сценарій у звичайному режимі та в режимі наладки. Він повинен працювати без помилок.
Зробіть помилки у вашому сценарію: подивіться, що буде відбуватись, якщо ви невірно напишете команди; якщо ви залишите перший рядок порожнім або запишете туди щось незрозуміле; якщо ви допустите помилки у написанні імен змінних чи напишете їх малими літерами. Подивіться, як це "прокоментує" наладчик.
Прим. перекладача.