У цьому вступному розділі ми:

  • Розглянемо декілька стандартних оболонок.
  • Зазначимо переваги та особливості GNU Bash.
  • Розглянемо основи оболонки.
  • Обговоримо файли ініціалізації Bash.
  • Побачимо, як оболонка виконує команди.
  • Подивимось на приклади простих сценаріїв.

Поширені програми-оболонки

Основні функції оболонки

Програма-оболонка в UNIX тлумачить команди, котрі або подає сам користувач, або читаються з файлів. Такі файли з командами оболонки називаються сценаріями (чи програмами) оболонки. Ці сценарії не компілюють, а тлумачать (інтерпретують). Це означає, що оболонка прочитує сценарій від початку (згори) до кінця (донизу), рядок за рядком, шукаючи зазначені там команди й виконуючи їх; на відміну від цього підходу, компілятор перетворює цілу програму до вигляду, придатного до виконання машиною — потім файл з таким кодом можна використати в сценарії оболонки^scripts.

Окрім пересилання команд ядру, головним завданням оболонки є забезпечення користувацького середовища, яке можна налаштувати за допомогою файлів конфіґурації.

Види оболонок

Подібно до того, як люди знають декілька мов та діалектів, UNIX надає на ваш вибір декілька різних оболонок:

sh, чи оболонка Борна (Bourne Shell) : перша оболонка, яка була використана у UNIX-подібних середовищах. Це базова оболонка, маленька та з невеликим набором можливостей. Та й хоча вона не є стандартною оболонкою, вона присутня на кожній системі з встановленим Linux. Це зроблено для того, щоб забезпечити сумісність з програмами UNIX.

bash, чи нова оболонка Борна (Bourne Again Shell) : стандартна оболонка GNU, інтуїтивна та розвинена. Вона підійде як новачкам, так і професіоналам. У більшості користувачів Linux стандартною оболонкою встановлено саме bash. У деякому сенсі bash -- це надбудова над sh, набір доповнень та додаткових модулів. Таким чином, нова оболонка Борна сумісна зі звичайною оболонкою Борна: команди, що працюють у sh, будуть працювати і у bash. Тим не менш, зворотне твердження не завжди є вірним. Усі приклади в цій книзі використовують bash.

csh, чи C-орієнтована оболонка (C Shell) : синтаксис цієї оболонки схожий із мовою програмування C. Зазвичай, цією оболонкою користуються програмісти.

tcsh, чи покращена C-орієнтована оболонка (Turbo C Shell) : надбудова над csh, швидка та зручна.

ksh, чи оболонка Корна (Korn Shell) : цінується у середовищі адептів UNIX. Вона є надбудовою над оболонкою Борна. Також, якщо не настроїти, вона є справжнім пеклом для новачків.

У файлі /etc/shells знаходиться інформація про оболонки, присутні у системі:

mia:~> cat /etc/shells
/bin/bash
/bin/sh
/bin/tcsh
/bin/csh

Стандартна оболонка встановлюється у файлі /etc/passwd. Наприклад, рядок користувача mia:

mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

Для того, щоб змінити оболонку, достатньо ввести її назву у командному рядку активного терміналу. Система буде шукати файл з вказаною назвою у каталогах, записаних у змінній PATH. Кожна оболонка -- просто програма, то ж, коли поточна оболонка знаходить файл програми, вона виконує його і ви входите у нову оболонку. Зазвичай, нова оболонка привітає вас своїм запрошенням командного рядка:

mia:~> tcsh
[mia@post21 ~]$

Особливості оболонки Bourne Again Shell

Bash є GNU-оболонкою

Проект GNU забезпечує UNIX-подібні (і не тільки) системи інструментами, які є вільними та водночас відповідають стандартам UNIX.

Bash є сумісною з sh оболонкою, що об'єднує корисні особливості оболонок Корна та С. Вона відповідає стандартові оболонок та інструментів IEEE POSIX P1003.2/ISO 9945.2. Вона також пропонує функціональні поліпшення над sh як для програмування, так і для інтерактивного використання, що включає в себе редагування командного рядка, необмежену історію команд, керування завданнями, функції та псевдоніми оболонки, індексовані масиви безмежного розміру і цілочисельну арифметику за будь-якою основою від 2 до 64. Bash може виконати більшість сценаріїв sh без потреби вносити до них будь-які зміни.

Як і інші проекти GNU, bash написана з метою збереження, захисту та поширення свободи використання, вивчення, копіювання, зміни й повторного використання програмного забезпечення. Окрім того, bash надає багато функцій, котрих не можуть запропонувати інші оболонки.

Особливості, властиві тільки для bash

Багатосимвольні параметри

На додаток до односимвольних параметрів командного рядка, які можуть бути змінені за допомогою вбудованої команди set, ви можете також використовувати цілий ряд багатосимвольних опцій. Ми згодом розглянемо кілька найбільш популярних з них; повний список ви зможете знайти в сторінках документації info, що розповсюджуються разом з оболонкою bash, в розділі Bash Features, підрозділі Invoking Bash.

Файли ініціалізації bash

Під час свого запуску оболонка bash прочитує й виконує певні сценарії, котрі називаються ініціалізаційніми файлами. Залежно від того, в якому режимі запускається оболонка, ці файли можуть бути різними. Зараз ми розглянемо ці режими.

Інтерактивна реєстраційна оболонка. Коли оболонка не виконує якийсь сценарій, а чекає на ваші команди, то вона є інтерактивною. Реєстраційною є оболонка, що надається вам одразу після успішної реєстрації в системі (для цього зазвичай надається реєстраційне ім'я та пароль). Bash можна змусити запрацювати в реєстраційному режимі, давши їй ключ запуску --login.

Зчитуються файли:

  • /etc/profile
  • ~/.bash_profile, ~/.bash_login або ~/.profile — зчитується перший файл з переліку, який знайдеться й матиме доступ на читання
  • ~/.bash_logout — після завершення сеансу роботи

Якщо оболонка знаходить файли конфіґурації, але вони не доступні для читання, то виводиться повідомлення про помилку. Якщо файлу немає, оболонка переходить до пошуку наступного.

Інтерактивна оболонка без реєстрації. Запуск без реєстрації означає, що ви не повинні реєструватися в системі. Наприклад, якщо ви запускаєте термінал з допомогою іконки чи пункту меню – це запуск без реєстрації.

Зчитуються файли:

  • ~/.bashrc

Звернення до цього файлу, як правило, є в файлі ~/.bash_profile:

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

Для детальнішої інформації про команду if зверніться до 7 розділу.

Неінтерактивний режим. Усі сценарії використовують неінтерактивні оболонки. Вони запрограмовані на вирішення певних задач і не можуть виконувати роботу, на яку не запрограмовані.

При запуску прочитуються файли, що визначені змінною BASH_ENV.

Змінна PATH не використовується при пошуку файлу, тому вам потрібно вказувати повний шлях до файлів ініціалізації.

Оболонка, викликана командою sh. Bash старається поводитись так само, як традиційна оболонка sh, дотримуючись заразом і стандартів POSIX.

Зчитуються файли:

  • /etc/profile
  • ~/.profile

При інтерактивному запуску змінна ENV може вказувати на додаткову інформацію запуску.

Режим POSIX. Цей режим встановлюється або викликом вбудованої команди set:

set -o posix

або запуском програми bash з опцією --posix. Тоді bash буде якнайстаранніше дотримуватись стандартів POSIX для оболонок. Того ж можна досягти встановленням змінної POSIXLY_CORRECT.

Зчитуються файли, визначені змінною ENV

Віддалений запуск. Коли запускається rshd, зчитується файл ~/.bashrc.

Увага: Уникайте використання r-інструментів!

Пам'ятайте, що використання таких інструментів, як rlogin, telnet, rsh та rcp є небажаним. Вони є небезпечними, оскільки не шифрують конфіденційні дані при передачі через мережу. Якщо вам потрібні інструменти для віддаленої роботи, передачі файлів та інших задач, використовуйте реалізації безпечних оболонок (Secure Shell, відомий як SSH), що доступні для вільного завантаження з http://www.openssh.org. Доступні також клієнтські програми для не-UNIX систем.

Режим, коли фактичний ідентифікатор користувача не дорівнює діючому. В цьому випадку файли ініціалізації не зчитуються.

Інтерактивні оболонки

Що таке інтерактивні оболонки?

Інтерактивна оболонка зчитує і пише на термінал користувача, іншими словами введення інформації та її вивід приєднані до терміналу користувача. Інтерактивна поведінка оболонки bash починається з введення команди bash без аргументів за винятком тих випадків, коли bash запущена для зчитування даних з стандартного вводу, що дозволяє встановлювати позиційні параметри (див. розділ 3).

Щоб дізнатись, чи є ця оболонка інтерактивною, гляньте на вміст спеціального параметра -, він містить літеру «і» в такому випадку:

eddy:~> echo $-
himBH

Поведінка інтерактивних оболонок

Відмінності інтерактивного режиму:

  • bash зчитує файли ініціалізації
  • типово задіяний контроль над завданнями
  • встановлені підказки командного рядка: PS2, що використовується для багаторядкових команд, встановлена зазвичай в «>». Ви також бачите підказки, коли оболонка вважає, що ви ввели незавершену команду, наприклад забули лапки.
  • команди типово зчитуються з командного рядка за допомогою readline
  • bash інтерпретує опцію оболонки ignoreeof замість негайного виходу після отримання сигналу EOF (End Of File)
  • історія введених команд та розширення команд з історії задіяні по замовчуванню. Історія команд зберігається у файлі, на який вказує змінна HISTFILE в момент завершення роботи оболонки. По замовчуванню HISTFILE вказує на ~/.bash_history
  • доступне розширення псевдонімів
  • при відсутності пасток сигнал SIGTERM ігнорується
  • при відсутності пасток сигнал SIGINT <-- відловлюється -->перехоплюється та обробляється, тому ввід, наприклад, Ctrl+C не призводить до виходу з інтерактивної оболонки
  • відправлення сигналу SIGHUP всім завданням при виході контролюється опцією huponexit
  • команди виконуються після зчитування
  • bash періодично перевіряє наявність електронної пошти
  • bash може бути налаштований на завершення роботи, коли він зустрічає незадіяні змінні. По замовчуванню така поведінка відключена
  • коли вбудовані команди призводять до помилок перенаправлення, оболонка не повинна завершувати свою роботу
  • коли вбудовані команди завершуються з помилкою, в режимі POSIX це не є причиною для аварійного завершення роботи оболонки. Список вбудованих команд дивіться в секції 1.3
  • невдале завершення команди exec не призводить до виходу з оболонки
  • синтаксичні помилки аналізатора не призводять до виходу з оболонки
  • по замовчуванню задіяна проста перевірка правопису для cd
  • задіяне автоматичне завершення роботи після завершення часу, що задається змінною TMOUT

Додаткова інформація:

Умовні вирази

Умовні вирази використовуються складеною командою <a href="../conditional_statements/"> та вбудованими командами test та [.

Вирази можуть бути унарними або бінарними. Унарні вирази часто використовуються для перевірки статусу файлу. Вам потрібен тільки один об’єкт, наприклад файл, для того, щоб виконати операцію. Доступні також рядкові оператори та оператори числового порівняння; це є бінарні оператори, що вимагають два об’єкти для завершення операції. Якщо аргумент FILE до одного з них має вигляд /dev/fd/N, то перевіряється файловий дескриптор N. Якщо ж аргумент FILE для одного з параметрів є /dev/stdin, /dev/stdout чи /dev/stderr, то використовуються відповідно файлові дескриптори 0, 1 чи 2. Детально умовні вирази обговорюються в [[розділі 7.

Більше інформації про файлові дескриптори ви знайдете у параграфі 8.2.3.

Арифметика оболонки

Оболонка дозволяє обчислення арифметичних виразів, як зовнішніми командами, так і вбудованою let. Обчислення здійснюється для цілих чисел, без перевірки на переповнення; проте ділення на 0 відловлюється і сигналізується про помилку. Оператори, їх вагомість та асоціативність є такими ж, як і в мові С, (див розділ 3).

Псевдоніми

Псевдоніми дозволяють однією стрічною замінювати іншу при використанні першим словом у простій команді. Оболонка підтримує список псевдонімів, які можуть бути встановлені та видалені за допомогою команд alias та unalias відповідно.

Bash завжди зчитує як мінімум один повний рядок перш ніж виконати хоч одну команду. Псевдоніми замінюються після зчитування, а не після виконання команди. Тому повторне включення псевдоніма у той самий рядок не дасть ніякого ефекту: команди, що зустрічаються після визначення псевдоніму в тому ж рядку не сприймаються як псевдоніми.

Псевдоніми замінюються тоді, коли зчитується означення функції, а не тоді, коли функція вже виконалась, оскільки означення функції є по суті зовнішньою командою. Як наслідок – псевдоніми, що визначені всередині функції недоступні за її межами. Ми повернемось до псевдонімів у розділі 3.5

Масиви

Bash вміє працювати з одновимірними масивами. Будь-яка змінна може використовуватись як масив, вбудована команда declare явно оголошує масив. Немає як обмежень на довжину масиву, так і певних вимог щодо його елементів. Масиви є нуль-основними. Див. розділ 10 для детальнішої інформації.

Стек каталогів

Стек каталогів — це список недавно відвіданих каталогів. Вбудована команда pushd додає каталог в стек і це призводить до зміни поточного каталога; popd видаляє вказаний каталог зі стеку та змінює поточний каталог на видалений.

Вміст стеку може бути відображений командою dirs або перевіркою змінної DIRSTACK. Детальну інформацію про роботу цього механізму можна отримати в сторінці info для оболонки bash.

Підказка

Bash робить роботу з підказкою доволі веселою. Перегляньте секцію Controlling the Prompt в сторінках info оболонки bash.

Обмежена оболонка

Бувають випадки, коли необхідно створити контрольованіше за стандартну оболонку середовище. Тоді можна викликати bash з ключем --restrict чи -r, або ж командою rbash, і оболонка працюватиме в так званому «обмеженому режимі». Певні дії в ньому не дозволяються, інші — мовчки нехтуються. Ось перелік відмінностей обмеженого режиму від звичайного:

  • неможливо змінювати каталоги за допомогою cd
  • змінні SHELL, PATH, ENV та BASH_ENV стають захищеними від змін та знищення
  • в назвах команд не можна вказувати похилі риски, виконуючи таким чином команди з місць, відмінних від вказаних у PATH
  • команда . (source) не працюватиме, якщо її арґумент містить похилу
  • вбудована команда hash не сприймає похилих з опцією -р
  • стає неможливим імпорт функцій при завантаженні
  • при завантаженні ігнорується SHELLOPTS
  • блокується переспрямування виводу за допомогою >, >|, ><, >&, &> та >>
  • блокується вбудована команда exec
  • блокуються опції -f та -d для вбудованої команди enable
  • стандартне значення PATH не може бути встановлене за допомогою вбудованої команди command
  • вимкнення цього режиму є неможливим

При виконанні сценарію оболонки rbash вимикає всі ці обмеження у дочірній оболонці.

Додаткова інформація:

Виконання команд

Загальні відомості

Bash визначає тип програми що має виконуватись. Системні команди – це звичайні програми, що в скомпільованому вигляді присутні у вашій системі. Коли виконується така програма, породжується новий процес, оскільки bash робить точну копію себе.

Дочірній процес має точно таке ж саме оточення, що й батьківський за винятком ідентифікатора процесу. Ця процедура називається відгалуженням (forking).

Після відгалуження адресний простір дочірнього процесу перезаписується даними нового процесу. Це робиться за допомогою системного виклику exec.

Таким чином цей механізм замінює стару програму новою, при чому оточення нової програми залишається ідентичним, включаючи налаштування пристроїв вводу-виводу, змінні оточення та пріоритет. Такий механізм використовується для створення всіх UNIX-процесів, то ж ним послуговується й Linux. Тільки перший процес, init, з ідентифікатором процесу 1, відгалужується під час виконання процедури початкового завантаження.

Вбудовані команди оболонки

Вбудовані команди містяться всередині оболонки. Коли ім’я вбудованої команди використовується як перше слово простої команди, оболонка виконує таку команду безпосередньо, без створення нового процесу. Вбудовані команди є необхідними для створення функціональності, реалізація котрої зовнішніми інструментами неможлива або незручна.

Bash підтримує 3 типи вбудованих команд:

  • вбудовані команди оболонки Борна

    :, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask та unset.

  • власні вбудовані команди

    alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit та unalias.

  • особливі вбудовані команди

    Коли bash запускається в режимі POSIX, особливі вбудовані команди відрізняються від інших за трьома ознаками:

    1. Особливі вбудовані команди переглядаються першими під час пошуку команди.
    2. Якщо особлива команда повертає помилку при виконанні, неінтерактивна оболонка завершує свою роботу.
    3. Оператори привласнення, що передують команді, зберігають свою силу в оточенні оболонки після того, як команда завершиться.

    Особливими вбудованими командами POSIX є:

    :, ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap та unset.

    Більшість цих команд будуть обговорюватися в наступних розділах. Щодо тих команд, котрі не будуть описані, рекомендуємо звернутись до сторінок документації info.

Виконання програм із сценаріїв.

Коли на виконання поступає сценарій оболонки, bash породжує новий дочірній процес за допомогою fork. Ця підоболонка зчитує рядки сценарію один за одним. Команди кожного рядка інтерпретуються та виконуються так, ніби вони були введені з клавіатури.

Поки дочірня оболонка обробляє рядки сценарію, батьківська чекає на її завершення. Після того, як дочірня оболонка обробить весь сценарій, вона завершує свою роботу. Тоді прокидається батьківська оболонка і виводить новий рядок підказки, сигналізуючи про готовність продовжити роботу.

Складники

Складники оболонки

Синтаксис оболонки

Якщо ввід незакоментований, оболонка зчитує його та ділить на слова і оператори, використовуючи правила цитування для того, щоб визначити значення кожного символу вводу. Далі ці слова й оператори транслюються в команди та інші конструкції, вивід та статус завершення яких доступний для перевірки чи обробки. Вищенаведена схема відгалуження-та-виконання (fork-and-exec) застосовується тільки після того, як оболонка проаналізує ввід наступним чином:

  • оболонка зчитує ввід з файлу, рядка або терміналу користувача;
  • ввід розбивається на слова та оператори згідно правил цитування (див Розділ 3). Ці лексеми розділяються метасимволами. Виконується розіменування псевдонімів;
  • оболонка аналізує отримані лексеми та компонує їх у прості і складені команди;
  • bash виконує різноманітні розкривання параметрів, розбиваючи розширені лексеми на списки назв файлів та команд і аргументи;
  • за необхідності виконується перенаправлення, після чого оператори перенаправлення та їх операнди видаляються зі списку аргументів;
  • команди виконуються
  • при бажанні оболонка чекає на завершення команди та зберігає її статус завершення

Команди оболонки

Проста команда оболонки, як, наприклад, touch file1 file2 file3, складається з власне команди та списку аргументів, розділених пробілами.

Повніші команди складаються з простих, об’єднаних різними способами: в конвеєри, коли вивід одної команди стає вводом іншої, у петлі або умовні конструкції та ін. Кілька прикладів:

ls | more 
gunzip file.tar.gz | tar xvf -

Функції оболонки

Функції оболонки — це об’єднання команд під певним іменем для подальшого вжитку. Вони виконуються так само, як і звичайні команди. Коли назва функції використовується як проста команда, виконується список команд, пов'язаних з даною функцією. Функції оболонки виконуються в поточному контексті оболонки; новий процес для їх інтерпретації та виконання не створюється.

Функції детально розглядаються в розділі 11.

Параметри оболонки

Параметр — це об’єкт, що містить певне значення. Він може бути назвою, числом тощо. В термінах оболонки змінна — це параметр, що має назву. Вона має значення та нуль або більше атрибутів. Змінні створюються вбудованою командою declare.

Якщо значення змінної не задано, їй присвоюється порожній рядок. Змінна може бути видалена командою unset. Робота зі змінними обговорюється в параграфі 3.2, розширене використання змінних — у розділі 10.

Розкривання команд оболонки

Щоразу, коли команда користувача поділена на лексеми, здійснюється обрахунок лексем. Виконуються наступні розкривання:

  • операції в дужках
  • розкривання тильди (~)
  • розкривання значень змінних та параметрів
  • підстановка команд
  • арифметичні операції
  • поділ слів
  • розкривання імен файлів

Детальніше ми обговоримо ці дії в параграфі 3.4.

Перенаправлення

Перед виконанням команди її ввід та/або вивід можуть бути перенаправлені за допомогою спеціальних позначень, зрозумілих оболонці. Перенаправлення також може застосовуватись для відкривання та закривання файлів для поточного середовища оболонки.

Виконання команд

Коли виконується команда, слова, котрі лексичний аналізатор позначив, як призначення змінних (що передують імені команди) та перенаправлення, зберігаються для подальшого використання. Слова, що не є призначеннями змінних чи перенаправленнями, розкриваються; перше слово після розкривання приймається за назву команди, інші — за її аргументи. Далі виконуються перенаправлення та розкриваються ланцюжки — значення змінних. Якщо назви команди не знайдено, змінні будуть задіяні в поточному середовищі оболонки.

Важливою частиною роботи оболонки є пошук команд. Bash робить це наступним чином:

  • перевіряє, чи команда містить похилі риски. Якщо ні, перевіряється список функцій на наявність потрібної команди.
  • якщо команда не є функцією, перевіряється список вбудованих команд
  • у випадку невдачі команда шукається у списку каталогів, на який вказує змінна PATH. Bash використовує хеш-таблицю (область зберігання даних в пам’яті) для зберігання повних імен виконуваних файлів, тож розширений пошук каталогів PATH може не здійснюватись.
  • якщо пошук завершився невдачею, bash друкує повідомлення про помилку та повертає статус завершення 127
  • якщо пошук закінчився успішно або якщо команда містить похилі риски, оболонка виконує команду у окремому середовищі
  • якщо виконання завершується невдачею через те, що файл не є виконуваним та не є каталогом, передбачається, що це — сценарій оболонки
  • якщо команда не запустилась в асинхронному режимі, оболонка чекає на її завершення та зберігає статус завершення

Сценарії оболонки

Коли файл, що містить команди оболонки, використовується як перший аргумент під час виклику bash (без -s чи -c), створюється неінтерактивна оболонка. Ця оболонка спершу шукає файл сценарію в поточному каталозі, а в випадку невдачі – в каталогах PATH.

Розробка правильних сценаріїв

Властивості правильних сценаріїв

Цей посібник переважно описує роботу зі сценаріями. Перш ніж продовжити, давайте домовимось, що:

  1. Сценарій повинен запускатись без помилок.
  2. Він повинен виконувати роботу, для якої призначений.
  3. Логіка програми повністю визначена та очевидна.
  4. Сценарій не виконує роботи, яка не є обов’язковою.
  5. Сценарії можуть використовуватись повторно.

Структура

Структура сценаріїв надзвичайно гнучка. І хоча в bash вам дається величезна свобода, все ж забезпечення вірності логіки та керування виконанням, а також ефективності, залишається за вами, щоб користувачі, котрі запускатимуть сценарій, могли це робити легко та правильно.

Розпочинаючи писати новий сценарій, поставте собі такі запитання:

  • Чи буде мені потрібна якась інформація від користувача чи з його середовища?
  • Як я зберігатиму інформацію?
  • Чи потрібно створювати якісь файли? Де, з якими правами доступу та власником?
  • Якими командами я скористаюсь? Якщо сценарій буде запускатись на різних системах, то чи є в них необхідні версії цих команд?
  • Чи потрібно виводити якісь повідомлення для користувача? Коли й чому?

Термінологія

Нижче наведено огляд термінів програмування, з якими ви повинні бути знайомі.

Про логіку та порядок

Для того, щоб пришвидшити процес розробки, логічну структуру програми потрібно продумати наперед. Це ваш перший крок при розробці сценаріїв. При цьому можуть використовуватись різні методики; найбільш поширеною є робота зі списками. Перелік списку завдань, що вирішуються програмою, дозволяє описати кожну завдання зокрема. На кожне із завдань можна посилатись за їх порядковим номером.

Використання вашої рідної мови для запису завдань, що повинна виконати ваша програма, допоможе надати вашій програмі зрозумілої форми. Пізніше ви зможете перевести ваші речення на мову машини.

Нижченаведений приклад ілюструє даний підхід.

  1. Чи хочете ви використовувати чергування протокольних файлів?
    • якщо так
      1. ввести назву каталога, що буде містити протоколи
      2. ввести базове ім’я протокольного файлу
      3. ввести, скільки кількість днів файл буде зберігатись
      4. запам’ятати вибір у користувацькому файлі crontab.
    • якщо ні, перейти до пункту 3
  2. Чи хочете ви використовувати інший набір протокольних файлів?
    • якщо так, перейти до кроку 1
    • якщо ні, перейти до кроку 3
  3. Вихід.

Користувач повинен дати програмі певну інформацію для виконання завдання. Ввід користувача повинен бути отриманий та збережений. Користувача потрібно попередити, що його файл crontab змінено.

Приклад сценарію: mysystem.sh^bashlocation

Наведений сценарій mysystem.sh виконує відомі команди (date, w, uname, uptime) щоб відобразити інформацію про вас та ваш комп’ютер.

tom:~> cat -n mysystem.sh
    1  #!/bin/bash
    2  clear
    3  echo "Ця інформація надана сценарієм mysystem.sh. Програма запускається."
    4
    5  echo "Привіт, $USER"
    6  echo
    7
    8  echo "Сьогодні `date`, `date +"%V"`."
    9  echo
   10
   11  echo "Зараз підєднані такі користувачі:"
   12  w | cut -d " " -f 1 - | grep -v USER | sort -u
   13  echo
   14
   15  echo "Це `uname -s` запущений на процесорі `uname -m`."
   16  echo
   17
   18  echo "Інформація про час безперервної роботи:"
   19  uptime
   20  echo
   21
   22  echo "Ось і все!"

Сценарій завжди починається з двох символів, «#!». Після них вказується ім’я оболонки, що буде виконувати сценарій. Сценарій розпочинається очищенням екрану (рядок 2). Третій рядок інформує користувача про те, що зараз відбудеться. П’ятий рядок вітає користувача по імені. Рядки 6, 9, 13, 16 та 20 відділяють вивід команд один від іншого для унаочнення. У 8-му рядку друкується поточна дата та номер тижня. 11-й рядок, як і 3, 18 та 22 є інформативним. 12-й формує вивід команди w, 15-й виводить назву операційної системи та інформацію про процесор, 19-й – тривалість роботи та завантаженість.

Контроль команди : перевірка статусу завершення команди для того, щоб визначити, чи буде виконуватись частина програми

Гілка умови : логічна точка програми, де певна умова визначає, яка частина програми має виконуватись далі

Логіка роботи : Повний проект програми. Визначає логічну послідовність завдань таким чином, щоб досягти успішного та керованого результату.

Цикл : Частина програми, що виконується нуль чи більше разів.

Користувацький ввід : Інформація, що надається зовнішнім джерелом під час виконання програми; може зберігатись та повторно використовуватись по мірі потреби.

Обидві команди – echo та printf – є вбудованими командами bash. Перша завжди повертає 0 та просто друкує аргументи аж поки не зустріне символ закінчення рядка, тоді як друга дозволяє використовувати символи форматування тексту та повертає код помилки у випадку невдачі.

Наведемо той самий сценарій з командою printf:

tom:~> cat mysystem.sh
#!/bin/bash
clear
printf " Ця інформація надана сценарієм mysystem.sh. Програма запускається."

printf "Привіт, $USER.\n\n"

printf "Сьогодні `date`, `date +"%V"`.\n\n"

printf "Зараз підєднані такі користувачі:\n"
w | cut -d " " -f 1 - | grep -v USER | sort -u
printf "\n"

printf "Це `uname -s`, запущений на процесорі `uname -m`.\n\n"

printf " Інформація про час безперервної роботи:\n"
uptime
printf "\n"

printf "Ось і все!\n"

Створення зручних сценаріїв буде розглядатись у розділі 8.

Підказка: Якщо stdout недоступний

Якщо ви запускаєте сценарій з cron, використовуйте повні назви файлів та перенаправлення виводу й помилок. Оскільки оболонка запущена в неінтерактивному режимі, будь-яка помилка призведе до завершення сценарію тоді, коли ви цього очікуватимете найменше.

Приклад сценарію ініціалізації

Сценарій ініціалізації запускає системні служби на Linux та UNIX машинах. Як приклад можна навести демони системного журналу, керування живленням, назв та елктронної пошти. Ці сценарії відомі також як запускні сценарії (startup scripts) та зберігаються у спеціально відведених місцях у вашій системі, як-от /etc/rc.d/init.d чи /etc/init.d. Init — процес ініціалізації — зчитує файли конфігурації та вирішує, який процес запустити чи зупинити на кожному з рівнів запуску. Рівень запуску (run level) — це конфіґурація процесів. Кожна система, до прикладу, має рівень єдиного користувача, призначений для виконання адміністративних задач, під час яких система має бути недоступною для інших — як-от відновлення критичної файлової системи з резервної копії. Зазвичай ще налаштовуються рівні для перезавантаження й вимкнення.

Задачі, що будуть виконані під час запуску чи зупинки служби, перераховуються в сценарії запуску. Однією з задач системного адміністрування є конфіґурація init таким чином, щоб потрібні служби запускались і зупинялись у потрібний момент. Коли ви зіткнетеся з цим завданням, вам буде потрібне хороше розуміння процедур запуску та завершення у вашій системі. Тому радимо познайомитись з сторінками info для init та inittab до того, як розпочнете роботу над вашими запускними сценаріями.

Наведемо дуже простий приклад, який відтворює музику під час вимкнення вашого комп’ютера.

#!/bin/bash
# Це сценарій для /etc/rc.d/init.d
# Зєднайте з rc3.d/S99audio-greeting та rc0.d/K01audio-greeting
case "$1" in
'start')
  cat /usr/share/audio/at_your_service.au > /dev/audio
  ;;
'stop')
  cat /usr/share/audio/oh_no_not_again.au > /dev/audio
  ;;
esac
exit 0

Службове слово case дуже часто використовується в сценаріях такого ґатунку (див параграф 7.2.5).

Підсумок

Bash є GNU-оболонкою, сумісною з оболонкою Борна та розширеною багатьма корисними речами з інших оболонок. Під час запуску оболонка зчитує свою конфігурацію з файлів. Найважливішими з них є:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bashrc

Bash поводиться по-різному у різних режимах — інтерактивному, POSIX-сумісному, обмеженому. Команди оболонки можна поділити на три групи: функції оболонки, вбудовані команди та зовнішні команди. Bash підтримує ширший у порівнянні з sh набір вбудованих команд.

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

Вправи

Ось деякі вправи, які ми рекомендуємо розв’язати, перш ніж перейти до наступного розділу:

  1. Де у вашій системі знаходиться програма bash?
  2. За допомогою опції --version дізнайтесь, яку версію оболонки ви запустили.
  3. Які конфігураційні файли зчитуються в той момент, коли ви реєструєтесь у системі використовуючи графічний інтерфейс користувача, а потім запускаєте оболонку за допомогою меню?
  4. Чи є наведені оболонки інтерактивними? Реєстраційними?

  5. оболонка, запущена з допомогою меню графічного інтерфейсу користувача

  6. оболонка, запущена командою ssh localhost
  7. оболонка, в яку ви попадаєте після реєстрації в текстовому режимі
  8. оболонка, запущена командою xterm &
  9. оболонка, відкрита сценарієм mysystem.sh
  10. оболонка, яку ви отримали на віддаленому комп’ютері не вводячи імені користувача та пароля, бо ви використовували ssh та(можливо) ключі ssh

  11. Поясніть, чому bash не завершує свою роботу, коли ви тиснете ctrl+c у командному рядку?

  12. Як подивитись вміст стеку каталогів?
  13. Змініть підказку bash таким чином, щоб в ній відтворювався поточний каталог, додавши, наприклад, такий рядок до файлу ~/.bashrc:

     export PS1="\u@\h \w> "
    
  14. Покажіть збережені команди вашого поточного сеансу.

  15. Скільки зараз процесів запущено у вашій системі? Використовуйте ?ps та wc; врахуйте, що перший рядок виводу ps не є процесом!
  16. Як відобразити ім’я комп’ютера? Тільки ім’я, більш нічого!

Прим. перекладача.