Взаємодія користувача з операційною системою можлива лише за наявності відповідного інтерфейсу. Для Windows найчастіше використовується графічний інтерфейс, для Linux-подібних систем – інтерфейс командного рядка, наявність якого забезпечують так звані Shell-оболонки. Однією з таких оболонок є Bash (Bourne again shell), яка забезпечує можливість керування Linux системою за допомогою команд. Однак для її ефективного використання необхідно мати уявлення про її можливості та правила застосування у тому чи іншому випадку. Розберемо докладніше ці питання.
Характеристики Bash
Програма є інтерпретатором командної мови, здатним виконувати команди, що надходять із стандартного введення (режим командного рядка) або файлу (режим сценарію). Тут реалізований імперативний спосіб обробки команд, при якому йде їх послідовне виконання в міру надходження на вхід інтерпретатора. Це зближує Bash з популярними мовами програмування, такими як C, Python и Java, з яких були взяті основні принципи програмування та організації програм, зокрема це стосується структурного розбиття сценаріїв на незалежні частини.
Bash відповідає вимогам специфікації IEEE POSIX, тому є POSIX-сумісним програмним засобом.
Bash повністю сумісна з оболонкою sh (Bourne Shell), Bash повністю сумісна з оболонкою csh (C-Shell) та ksh (Korn- Shell), що полегшує одночасне використання зазначених програм на одній машині.
Як і в будь-якому командному процесорі, Bash передбачено наявність двох видів команд – внутрішніх та зовнішніх. Перші постійно перебувають у оперативної пам'яті (ОП) машини і, відповідно, виконуються швидше. До них, наприклад, відносяться команди зміни каталогу (cd), виведення вмісту змінної на екран (echo) та ін. Зовнішні команди здатні реалізувати більш потужні можливості інтерпретатора, але вимагають більшого часу виконання через більший обсяг та необхідність завантаження в ОП при кожному виклику.
При своїй роботі, як і будь-яка з мов структурного програмування, оболонка використовує ряд змінних, одні з яких є внутрішніми, іншими зовнішніми. У внутрішніх змінних Bash зберігає значення параметрів програмного середовища оточення, які, зокрема, необхідні роботи програм і самої оболонки, а також отримання системної інформації.
Наведемо деякі з внутрішніх змінних:
- $HOME – містить повну назву домашнього каталогу поточного користувача;
- $PWD – містить інформацію від поточної директорії;
- $BASH_VERSION – зберігає версію командного процесора;
- $HOSTTYPE – зберігається апаратна конфігурація поточної машини;
- $PATH – зберігає інформацію про місце знаходження файлів програми.
Зовнішні змінні визначаються користувачем і зазвичай необхідні зберігання та виведення проміжних і кінцевих результатів виконання команд, як і звичайному режимі, і під час сценаріїв. При їх створенні необхідно дотримуватись певних правил:
- ім'я може починатися з символу підкреслення або літери;
- у їх назві можуть бути цифри, літери або символи підкреслення;
- під час написання імені потрібно враховувати регістр символів;
- заборонено використовувати спеціальні символи та зарезервовані системою слова.
Нижче нами будуть розглянуті прийоми роботи з оболонкою у двох режимах: одиночних команд та в режимі обробки сценаріїв.
Робота в режимі одиночних команд
Такий режим є базовим, тому що дозволяє користувачеві вести інтерактивний «діалог» з командним процесором за допомогою команд, що вводяться з терміналу. Це дозволяє користувачеві отримати практично будь-яку інформацію або виконати потрібну дію. Наприклад, це може бути наступний набір активностей:
- Дізнатися тип встановленої оболонки та її версію;
- Отримати повну назву поточної директорії;
- Змінити каталог або створити новий;
- Створити новий файл або редагувати наявний;
- Отримати повну інформацію про програмне середовище оточення;
Реалізуємо на практиці вже перелічені та деякі інші запити до bash.
Використання внутрішніх команд та змінних
Для початку переглянемо список оболонок, зареєстрованих у системі. Для цього наберемо наступну команду в терміналі:
$ cat /etc/shells
Як бачимо, командних процесорів може бути безліч, кожен з яких може використовуватися для певних цілей і тому буває необхідним дізнатися, який з них поточний. Для цього може бути використана така команда:
$ echo $SHELL
Можна переконатися, що поточною оболонкою зараз є bash.
Спробуємо Робимо дізнатися її версію за допомогою відповідної внутрішньої змінної:
$ echo $BASH_VERSION
Встановлена версія – 5.1.16, яка є найновішою.
Для того, щоб змінити поточну оболонку на будь-яку іншу з зареєстрованих, можна використовувати наступний формат команди:
$ chsh –s «ім'я та місцезнаходження оболонки» «логін користувача, для якого встановлюється»
Наприклад, у разі встановлення інтерпретатора sh для користувача root зазначена конструкція виглядатиме так:
$ chsh -s /usr/bin/sh root
Само собою, оболонка не зміниться миттєво, а лише після виходу із системи та проходження вказаним у команді користувачем повторної авторизації. Ознакою того, що ви працюєте з іншим командним процесором, буде змінено формат запрошення командного рядка. Так, для bash формат запрошення буде наступним:
Логін поточного користувача@ім'я вузла:поточний каталог Символ запрошення($ або #)
У нашому випадку виводяться такі дані:
Root – логін поточного користувача;
Dedicated – ім'я вузла;
~ – поточний каталог (домашній каталог користувача);
# – символ запрошення, що означає приналежність користувача до категорії суперкористувачів.
Щоб дізнатися домашній каталог поточного користувача, який, як ми вже бачили, часто позначається знаком тильди, можна скористатися інформацією, що міститься в одній із внутрішніх змінних. Переглянемо цю інформацію:
$ echo $HOME
Як бачимо, це каталог /root, що знаходиться в корені файлової системи.
Змінимо каталог на кореневий і побачимо, як зміниться рядок запрошення:
$ cd ..
Можна переконатися, що замість символу тильди, у запрошенні командного рядка з'явилася ознака кореневого каталогу (/), як і має бути. Тепер за допомогою конструкції ls переглянемо його вміст:
Тут ми можемо побачити домашній каталог користувача root.
Тепер повернемося назад:
$ cd root
Як бачимо, знак тильди знову з'явився у запрошенні, що говорить про те, що ми знову знаходимося в домашньому каталозі поточного користувача.
Часто буває необхідним отримати повну інформацію про програмному середовищі оточення, більшість якої зберігається, як ми знаємо, у внутрішніх змінних. Для цього можна скористатися наступним засобом:
$ printenv
В результаті, ми отримали повну інформацію про конфігурацію програмного оточення, що, зокрема, дає можливість виконувати коректне встановлення та налаштування стороннього програмного забезпечення, а також використовувати цю інформацію для оптимізації роботи самої системи.
У системі використовується кілька десятків внутрішніх команд, які важко запам'ятати. Тому для їх перегляду завжди можна скористатися внутрішнім довідником. Зробимо це:
$ help
Як видно з виведених результатів, багато команд мають додаткові аргументи, які завжди можна тут переглянути, не запам'ятовуючи їх спеціально, що дуже зручно.
Команди роботи з файлами
Для створення або перегляду файлів у системі є ряд вбудованих редакторів, основні з яких nano і vim.
Скористайтеся одним із них для створення файлу:
$ nano new_file1
У вікні додамо наступний рядок: «Це перший створений нами файл у системі Ubuntu». Результат показано нижче.
Щоб зберегти внесені у файл зміни, натисніть клавіші ctrl+O, потім Enter. Для виходу із редактора скористаємося клавішами ctrl+X.
Для перегляду вмісту створеного файлу можна знову викликати редактор або скористатися наступним засобом:
$ cat new_file1
Як бачимо, інформація виводиться безпосередньо на консоль. Це буває зручно у разі незначного обсягу інформації.
Крім того, є можливість створення порожнього файлу без запуску редактора. Це можна зробити так:
$ touch new_file2
Також для цих цілей можна скористатися наступною командою:
$ echo > new_file2
Якщо ж файл потрібно додати незначну кількість інформації, тоді попередня конструкція перетворюється наступним чином:
$ echo "Це перший створений нами файл у системі Ubuntu" > new_file2
Переглянемо його:
$ cat new_file2
Як бачимо, це цілком адекватно працює і навіть набуває кириличних символів.
Існує ще чимало засобів і способів створення файлів у середовищі bash, проте для їх детального розгляду потрібно кілька статей. Тим більше, що наше основне завдання – показати базові напрямки використання засобів bash, що ми робимо.
Використання сценаріїв
Як мовилося раніше, сценарії, поруч із стандартним введенням, є ще однією способом формування команд для оболонки, а, по суті, управління ядром операційної системи. Однак, на відміну від першого способу, сценарії дозволяють організувати потік команд, який виконуватиметься в автоматичному режимі у потрібний час без участі користувача. І тому мають безперечну перевагу перед одиночним введенням команд.
Принцип формування сценарію дуже простий. Створюється файл, який послідовно вводяться конструкції мови bash, які можуть бути як завгодно складними залежно від завдання, яке він вирішує. Потім файл зберігається із розширенням .sh.
Наприклад, створимо сценарій, у якому використовуватиметься зовнішня змінна під назвою ball, необхідна збереження проміжних і кінцевих результатів роботи нашого сценарію.
Нам потрібно створити файл сценарію та ввести до нього наступні рядки коду:
#!/bin/bash
echo "Скільки Ви отримали балів на вступних іспитах до Сільськогосподарської Академії?"
read ball
echo "Зрозуміло, значить Ви отримали $ball балів, я так і подумав"
Пояснимо призначення всіх символів і команд, що використовуються в коді.
Перший рядок є обов'язковим. Символи #! вказують інтерпретатору те що, що файл виконуваний, а чи не просто текст. Наступні символи в цьому ж рядку (/bin/bash) вказують на місцезнаходження та назву командного процесора, який має запускати сценарій.
Після цього йде список команд, які складають тіло сценарію. Зокрема, команда read покликана «читати» значення, введені користувачем з терміналу. Введені значення потім передаються зовнішнім змінним, як, наприклад, ball у нашому випадку. Команда echo, як ми знаємо, виводить на екран значення змінних.
Тепер запустимо редактор nano і вставимо у створений файл сценарію new_script.sh наведений вище код:
$ nano new_script.sh
Збережемо внесені зміни та закриємо файл (ctrl+X).
Для запуску сценарію вручну з командного рядка використовується два способи.
Перший спосіб запуску. Тут необхідне використання конструкції bash, інакше сценарій не запуститься:
$ bash new_script.sh
Результат наведено вище. Спочатку оболонка виводить перше запитання і чекає, доки користувач введе якесь значення. Після того, як значення введено, сценарій продовжує роботу і зрештою виводить результат, що ми й продемонстрували.
Другий спосіб запуску. У цьому випадку необхідно зробити файл сценарію здійсненним, а потім запустити з використанням спеціальної конструкції «./»:
$ chmod +x new_script.sh
Запустимо його:
$ ./new_script.sh
Можна переконатися, що результат виконання сценарію ідентичний результат попереднього способу.
Для автоматичного запуску сценаріїв у потрібний момент часу можна використовувати низку конфігураційних файлів, а також планувальник. Але це виходить за межі цієї статті.