Перейти до вмісту
Блог › Налаштування ПЗ › Робота з командною оболонкою Bash у Linux-системах

Робота з командною оболонкою Bash у Linux-системах

Взаємодія користувача з операційною системою можлива лише за наявності відповідного інтерфейсу. Для Windows найчастіше використовується графічний інтерфейс, для Linux-подібних систем — інтерфейс командного рядка, наявність якого забезпечують так звані Shell-оболонки. Однією з таких оболонок є Bash (Bourne again shell), яка забезпечує можливість керування Linux-системою за допомогою команд. Проте для її ефективного використання необхідно мати уявлення про її можливості та правила застосування в тому чи іншому випадку. Розберімо детальніше ці питання.

Характеристики Bash

Програма є інтерпретатором командної мови, здатним виконувати команди, що надходять зі стандартного вводу (режим командного рядка) або з файлу (режим сценарію). Тут реалізовано імперативний спосіб обробки команд, за якого відбувається послідовне їх виконання в міру надходження на вхід інтерпретатора. Це наближає Bash до популярних мов програмування, таких як C, Python і Java, з яких були запозичені основні принципи програмування та організації програм, зокрема структурний поділ сценаріїв на незалежні частини.

Bash відповідає вимогам специфікації IEEE POSIX, тому є POSIX-сумісним програмним засобом.

Bash повністю сумісна з оболонкою sh (Bourne Shell), яка є застарілим стандартом для всіх Unix-подібних систем. Вона також має багато спільного з оболонками 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

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

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Позначки: