Читайте также:
|
|
Робота з командною оболонкою BASH
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 2
з курсу «Операційні системи»
Львів 2015
Тема: Робота з командною оболонкою BASH
Мета: Оволодіти практичними навичками роботи та адміністрування в системі LINUX за допомогою командної оболонки BASH. Ознайомитись із оболонкою BASH, виконанням команд у BASH, змінними оболонки, синтаксисом BASH-сценаріїв.
Порядок виконання роботи
По номеру варіанта вибрати завдання і відповідно до методичних вказівок, за матеріалами рекомендованої літератури і конспекту лекцій виконати завдання і оформити звіт по роботі.
Зміст звіту
1. Початкові дані і постановка задачі.
2. Текст програми.
3. Результати виконання програми
4. Висновки.
Методичні вказівки
Оболонка BASH
Bash – це абревіатура від Bourne Again Shell. Це англомовна гра слів: bash побудована на основі оболонки Борна (bourne), яка, разом з оболонками Korn і С, вважається однією з класичних оболонок UNIX.
Так що ж таке оболонка? Оболонка в першу чергу призначена для виклику команд і програм в ОС Linux. Таким чином, вона є свого роду інтерпретатором. Оболонка виконується в будь-якому командному вікні, наприклад konsole, gnome-terminal, xterm, і в текстовій консолі після входу в систему (логування).
У той же час оболонка є потужною мовою програмування, за допомогою якої можна автоматизувати робочі процеси. Особливі команди оболонки дозволяють використовувати в рамках цієї програми змінні, створювати запити і цикли і т. д. Отримані в результаті проектування програми, залежно від уподобань автора, називаються командними файлами, пакетними файлами, сценаріями, процедурами оболонки і т. д. Незалежно від назви, мова в даному випадку йде про прості текстові файли, які виконуються (інтерпретуються) оболонкою.
Виконання команд
Зазвичай для запуску команди необхідно ввести її ім'я. У командному рядку можна вказати скільки завгодно спеціальних символів, які будуть інтерпретовані bash ще до запуску команди. Таким самим чином можна запускати команди у фоновому режимі, охоплювати за допомогою групових символів (джокерів) одночасно багато подібних імен файлів (наприклад *.tex), підставляти результати виконання однієї команди в список параметрів іншої команди і т. д.
2.1. Фонові процеси
Одним з найважливіших спеціальних символів є символ &. Якщо вказати його в кінці командного рядка, bash запустить програму у фоновому режимі. Це має сенс у першу чергу тоді, коли виконання команди займає багато часу, щоб можна було продовжувати роботу, не чекаючи закінчення виконання такої програми.
User$ find / -name '*sh' > result &
[1] 3345
Вищевказана команда шукає по всій файловій системі файли, назви яких закінчуються на sh. Список знайдених файлів записується у файлі result. Оскільки команда виконується у фоновому режимі, роботу можна не переривати. Результат [1] 3345 означає, що фоновий процес має номер PID 3345. Тут PID означає ідентифікатор процесу (process ID). Номер PID цікавий у тому випадку, коли процес був аварійно завершений командою kill. Номер в квадратних дужках це номер фонового процесу, запущеного в bash. Як правило, цей номер не важливий.
2.2. Виконання декількох команд
Після символу & ви також можете вказати наступну команду. У такому випадку перша команда буде виконуватися у фоновому режимі, а друга в явному. У наступному прикладі розглянута вище команда find знову запускається у фоновому режимі. Однак ls одночасно виводить зміст поточного каталогу:
user $ find / -name '* sh'> result & ls
Якщо замість символу & поставити крапку з комою, то bash по черзі виконає команди у фоновому режимі: ls; date
Ця команда спочатку відображає зміст поточного каталогу, а потім виводить поточний файл. Якщо необхідно перенаправити всю цю інформацію у файл за допомогою >, то обидві команди ставляться в круглих дужках. У такому випадку вони виконуються однією і тією ж оболонкою.
user $ (ls; date) > content
У файлі content тепер знаходиться список файлів, створений ls, а також поточна дата, з'ясована date. Завдяки круглим дужкам обидві команди виконуються однією і тією ж оболонкою і видають загальний результат (як правило, ситуація інша при запуску кожної нової команди активується нова оболонка).
Використовуючи поєднання символів && і ||, можна виконувати команди відносно, тобто залежно від результату іншої команди. Наприклад
user $ команда1 && команда2
виконує команду1 тільки у випадку, якщо ця команда була виконана успішно (без помилки, без видачі 0 в якості значення, що повертається)
Команда | Функція |
Команда1; команда2 | Виконує команди одна за одною |
Команда1 && команда2 | Виконує команду2, якщо команда1 була виконана успішно |
Команда1 || команда2 | Виконує команду2, якщо команда1 повертає помилку |
Команда & | Запускає команду в фоновому режимі |
Команда1 & команда2 | Запускає команду1 в фоновому режимі, команду2 — в явному |
(Команда1; команда2) | Виконує дві команди в одній і тій же оболонці |
Інші можливості для створення умов і розгалужень для команд пов'язані з використанням команди if.
3. Змінні оболонки
Функціональність bash та багатьох інших програм Linux керується станами так званих змінних оболонки. Такі змінні можна порівняти зі змінними мови програмування, проте в них можна зберігати тільки послідовності символів. Присвоювання змінних оболонки здійснюється за допомогою оператора присвоєння =. Щоб відобразити вміст оболонкової змінної, потрібно скористатися командою echo, при цьому перед ім'ям змінної необхідно поставити символ $:
user $ var = abc user $ echo $ var abc
При присвоєнні змінних не можна залишати між оператором присвоювання = і ім'ям змінної прогалин. Запис var = abc синтаксично невірний і працювати не буде.
Якщо у вмісті оболонкової змінної повинні міститися пробіли або інші спеціальні символи, то при присвоєнні всю послідовність символів необхідно укласти в одиночні лапки:
user $ var = 'abc efg'
При присвоєнні можна записувати один за одним відразу по кілька послідовностей символів. У наступному прикладі змінній а присвоюється нова послідовність символів, що складається з вмісту цієї змінної, послідовності символів xxx і ще раз з вихідного вмісту:
user $ a = 3
user $ a = $ a'xxx '$ a user $ echo $ a 3 xxx 3
У наступному прикладі наявна змінна PATH (зі списком усіх каталогів, в яких може здійснюватися пошук виконуваних програм) доповнюється в домашньому каталозі каталогом bin. Тепер ви можете виконувати будь-які команди, що знаходяться в цьому каталозі (Не вказуючи шлях повністю).
user $ echo $ PATH
/ Usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
user $ PATH = $ PATH ': / home / kofler / bin'
user $ echo $ PATH / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / home / kofler / bin
Обчислення з змінними можна робити в квадратних дужках описаним вище способом:
user $ a = 3 user $ a = $ [$ a * 4] user $ echo $ a 12
Вміст змінних зберігається тільки в оболонці. При виході з оболонки ця інформація втрачається. Якщо певні змінні потрібні вам знову, то присвоювання слід проводити у файлі / etc / profile або.profile домашнього каталогу. Обидва файли (якщо вони є) автоматично виконуються при запуску bash.
Якщо ви хочете зберегти вміст однієї із змінних у файлі, то потрібно виконати команду echo з переадресацією введення:
user $ echo $ var> file
3.1. Локальні і глобальні змінні(змінні оточення)
Терміни «локальний» і «глобальний» для опису змінних взяті зі світу мов програмування. Змінна оболонки вважається глобальною, якщо вона передається далі при запуску команди або програми оболонки. Часто глобальні змінні іменуються змінними оточення (environment variables).
Зверніть увагу, що всі змінні, отримані в результаті звичайного присвоювання, можуть бути тільки локальними! Щоб задати глобальну змінну, слід виконати export або declare -x.
Для управління змінними в оболонці існують численні команди, які функціонально іноді дублюють один одного. Наприклад, для оголошення глобальної змінної можна використовувати як export, так і declare -x. Наступні приклади наводяться для того, щоб трохи прояснити ситуацію з дублюючими командами:
· a = 3 Короткий спосіб запису let, змінна a є локальною
· declare a = 3 Привласнює локальній змінній а значення (як let)
· declare -xa = 3 Привласнює локальній зміннії а значення (як export)
· export Показує всі глобальні змінні
· export a Робить змінну а глобальної
· export a = 3 Привласнює глобальної змінної а значення
· let a = 3 Привласнює глобальної змінної а значення
· local a = 3 Визначає змінну а як локальну (лише у функціях оболонки)
· printenv Як і export, відображає всі глобальні змінні
· set Показує всі змінні (і локальні, і глобальні)
· unset a Видаляє змінну а
Якщо ви створюєте змінні, які повинні керувати роботою інших команд Linux, ці змінні завжди повинні бути глобальними. Присвоювання змінних завжди залишається дійсним тільки для однієї оболонки. Якщо ви працюєте з декількома терміналами або вікнами терміналів, в кожному з них функціонує самостійна оболонка, яка не залежить від інших. Зміна змінної в оболонці ніяк не впливає на інші оболонки. Однак часто використовувані присвоювання змінних можна записати у файлі ~ /.profile, Який буде автоматично виконуватися при запуску оболонки.
3.2. Найважливіші змінні оболонки
В принципі можна ввести скільки завгодно нових змінних, назвати їх на свій смак і використовувати за власним розсудом. При цьому не слід застосовувати змінні, які вже існують, так як вони зазвичай інтерпретуються bash, а часто й іншими командами Linux. При неконтрольованій зміні таких змінних можна пошкодити механізм обробки команд Linux.
У цьому розділі в алфавітному порядку будуть описані найважливіші оболонкові змінні.
· BASH містить ім'я файлу bash.
· HOME містить шлях до домашнього каталогу, наприклад /home/mk.
· LOGNAME зберігає логін (ім'я користувача).
· HOSTNAME містить хост-ім'я (ім'я комп'ютера).
· MAIL включає шлях до каталогу, в якому зберігається вхідна пошта (тільки якщо у вас встановлений локальний поштовий сервер).
· OLDPWD містить шлях до останніх використовувалися каталогах.
· PATH зберігає список каталогів. Якщо bash повинна виконати команду, вона переглядає всі каталоги, перераховані в PATH, у пошуках команди. Каталоги відокремлюються один від одного двокрапкою. Налаштування PATH відрізняється від дистрибутива до дистрибутива, в різних місцях системи в ході запуску (Init-V, Upstart). Найкраще робити власні зміни в / etc / profile або (якщо у вашому дистрибутиві передбачена така можливість) у файлі каталогу /etc/profile.d. Туди необхідно вставити команду у відповідності з наступним зразком:# Доповнення в / etc / profile або в /etc/profile.d/myown.sh
PATH = $ PATH: / myown / bin
З міркувань безпеки (щоб уникнути незапланованого виконання програм у поточному каталозі), в PATH не вказується локальний каталог. Якщо ви хочете виконувати програми, що містяться в поточному каталозі, що не вказуючи перед ними./, потрібно доповнити PATH точкою.
· PROMPT_COMMAND може містити команду, виконувану всякий раз, коли bash відображає запрошення командного рядка.
· PS1 зберігає послідовність символів, вміст якої відображається поруч з початком кожного рядка введення (ця послідовність називається підказкою, чи запрошенням). У ній передбачені в числі інших наступні послідовності символів: \ t поточний час, \ d сьогоднішня дата, \ w поточний каталог, \ W остання частина поточного каталогу (наприклад, X11 для / usr / bin / X11), \ u ім'я користувача, \ h хост-ім'я (ім'я комп'ютера), а також символ підказки \ $ (\ $ для звичайних користувачів, # для адміністратора).
· PS2 схожа на PS1, але ця послідовність символів зазвичай відображається тільки для багаторядкового введення (тобто якщо перший рядок завершується символом \). Типова настройка ">".
· PWD містить шлях до поточного каталогу.
Крім описаних тут, зазвичай використовуються і багато інших змінних оточення, які керують функціями оболонки, а також багатьох інших програм. Список всіх заданих змінних можна вивести за допомогою команди printenv | sort.
4. Синтаксис bash сценарію
Всі файли оболонки повинні починатися з рядка, що складається з символів #! та імені бажаної оболонки. У такому випадку для виконання файлу автоматично викликається зазначена оболонка. Для більшості сценаріїв оболонки вибирається #!/Bin/sh. Тільки якщо ви користуєтеся bash-специфічними функціями, потрібно спеціально вказати #!/Bin/bash.
Сценарії оболонки можуть виконуватися лише тоді, коли для них встановлені біти доступу, що забезпечують читання (r) і виконання (x). Якщо сценарії розташовані на зовнішніх носіях або сегментах дисків, потрібно переконатися, що до дерева каталогів підключений параметр exec.
Якщо ви пишете колекцію власних сценарних програм для щоденного використання, доцільно зберігати ці сценарії в одному і тому ж місці.
В якості каталогу підійде ~ / bin.
Якщо додатково внести такі ж зміни у файл.profile, ці сценарні програми можуть виконуватися і без вказівки повного шляху.
У деяких дистрибутивах робити це не потрібно, в них ~ / bin завжди входить до складу PATH.
# Addition in ~ /.profile or in ~ /.bashrc
PATH = $ PATH ': ~ / bin'
4.1. Змінні в bash сценаріях
Область визначення змінних
Щоб зрозуміти тонкощі використання змінних при виконанні програм оболонки, необхідні базові знання про механізми запуску команд і програм оболонки.
Для виконання команди або програми bash створює новий процес з власним PID-номером (такий номер використовується усередині системи Linux для ідентифікації процесу та управління ним). Новому процесу повідомляються тільки ті змінні оболонки, які були оголошені як змінні оточення (export або declare -x). Якщо команда запускається в пріоритетному режимі, bash продовжує працювати на фоні цієї команди, чекаючи, поки вона буде виконана. В іншому випадку обидві програми (тобто bash і запущена у фоновому режимі команда) виконуються паралельно.
Особливий випадок запуск програми оболонки. Програми оболонки виконуються аж ніяк не в працюючій оболонці, а в спеціально запущеному для цього командному підпроцесорі. У такому випадку одночасно працюють два зразки bash один для інтерпретації команд, а інший для виконання програм оболонки. Окремі командні підпроцесори потрібні оболонці для того, щоб можна було паралельно виконувати кілька програм оболонки, щоб вони при цьому не впливали один на одного (навіть якщо працюють у фоновому режимі).
Використання командних підпроцесорів особливо відбивається на управлінні змінними в тих випадках, коли кожен підпроцессор (або оболонка) володіє власним набором змінних. При запуску будь-якої іншої програми їй повідомляються лише ті змінні інтерактивної оболонки, які були оголошені як змінні оточення. Змінні оболонки і командного підпроцесора працюють повністю незалежно один від одного, тобто при внесенні змін в один набір змінних це ніяк не відбивається на іншому наборі.
Іноді може знадобитися оголосити в працюючій програмі нові змінні або змінити наявні змінні. Щоб це вийшло, можна виконувати оболонкові програми і в рамках вже запущеної оболонки bash, не використовуючи командний підпроцесор. Для цього потрібно поставити перед ім'ям файлу оболонкової програми точку або пробіл. Саме так коротко записується оболонкові команда source.
Ось приклад: ви хочете написати оболонкову програму, яка б доповнювала змінну PATH шляхом до поточного каталогу. Потрібна вам програма addpwd дуже проста:
#!/Bin/sh
# Оболонкові програма addpwd додає шлях до поточного каталогу #
PATH = $ PATH ":" $ (pwd)
Отже, тепер у змінній PATH зберігається її колишній вміст, двокрапка і результат виконання команди pwd остання частина зберігається завдяки підстановці команд. Наступний контрольний прогін показує, що вміст змінної PATH поточної оболонки зміниться лише тоді, коли ви поставите перед запускається командою addpwd точку (в командному подпроцессоре, запускається при першому зверненні до addpwd, PATH також змінюється, але ці зміни діють, поки виконується addpwd).
user $ echo $ PATH
/ Usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
user $ addpwd user $ echo $ PATH
/ Usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
user $. addpwd user $ echo $ PATH / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / home / user
Змінні які задаються оболонкою
Програми оболонки можуть звертатися і до деяких змінним, наперед заданим bash. Ці змінні не можна змінювати в ході присвоювання, їх можна тільки зчитувати. Ім'я змінної складається з різних спеціальних символів.
Змінна | Значення |
$? | Повертає значення останньої команди |
$! | Номер PID останнього запущеного процеса |
$$ | PID поточної оболонки |
$0 | Ім’я поточного файла який виконується в оболонці |
$# | Кількість параметрів, переданих програмній оболонці |
Від $1 до $9 | Параметр від 1 до 9 |
$* або $@ | Сукупність всіх переданих параметрів |
Змінні $0- $9, $# і $* служать для інтерпретації параметрів, що передаються програмі пакетній обробці.
У зв'язку з інтерпретацією параметрів цікава команда bash під назвою shift. Вона ніби переміщує передані параметри від змінної $0 до змінної $9. Якщо ви виконаєте shift 9, то перші дев'ять параметрів, переданих програмі, будуть втрачені, але ви легко зможете запросити наступні дев'ять. Якщо вказати shift без додаткових параметрів, то список зрушиться на один параметр.
Змінну $? можна використовувати для визначення умов, щоб змінити подальше виконання програми в залежність від результату останньої команди. В принципі команду можна прямо задати як умову, вказавши її таким чином в if.
Змінна $$ містить PID (ідентифікаційний номер процесу). Це числове значення застосовується всередині системи Linux для управління процесами. PID є унікальним, тобто у всій системі гарантовано відсутній другий процес з таким же номером, тому таке значення відмінно підходить для створення тимчасового файлу. Наприклад, за допомогою ls> tmp. $$ Можна зберегти список всіх файлів у файлі tmp.nnn. Навіть якщо такий же пакетний файл одночасно працює на іншому терміналі, у двох оболонках процеси будуть мати різні ідентифікаційні номери, що виключає виникнення конфлікту на рівні імен.
Масиви
Крім звичайних змінних, bash також розрізняє масиви. Зверніть увагу, що синтаксис для доступу до n-ному елементу відрізняється від синтаксису, прийнятого в С.
x = () # Визначення порожнього масиву
x [0] = 'a' # Присвоєння елементів масиву
x [1] = 'b' x [2] = 'c'
x = ('a' 'b' 'c') # Короткий варіант запису чотирьох попередніх рядків
echo $ {x [1]} # Зчитування елемента масиву
echo $ {x [@]} # Зчитування всіх елементів масиву
Для програмістів виключно важливі масиви асоціативних елементів, які стали підтримуватися в bash, починаючи з версії 4.0. Не забудьте, що масив спочатку потрібно спеціально оголосити як асоціативний за допомогою declare -A. В іншому випадку система вважатиме, що це звичайний масив. Тоді послідовності символів, що містяться в індексі, будуть інтерпретовані як 0, і у вас вийде звичайний масив, що складається з одного-єдиного елемента (Index 0).
declare -A y # Визначення порожнього масиву асоціативних елементів
y [abc] = 123 # Присвоєння елемента асоціативного масиву
y [efg] = xxx
y = ([abc] = 123 [efg] = xxx) # Короткий варіант запису двох попередніх рядків echo $ {y [abc]} # Зчитування одного елемента масиву
Ще одне важливе нововведення версії 4 полягає в тому, що за допомогою команди mapfile можна полінійно перетворити текстовий файл в елементи звичайного масиву:
mapfile z <текстовий_файл
Зчитування змінних за допомогою read
За допомогою bash-команди read можна обробляти користувацьке введення. Як правило, для цього спочатку за допомогою echo задається короткий текст, який повідомляє користувачеві, який ввід очікується (наприклад, y / n, числове значення і т. Д.). При цьому доцільно використовувати параметр -n, що дозволяє вводити дані відразу ж після тексту echo, а не з наступного рядка. При виконанні наступної команди read bash очікує від користувача введення рядка і натискання клавіші Enter.
Візьмемо програму, в якій цикл while виконується до тих пір, поки у змінній a не опиниться послідовність символів, яка задовольняє певним умовам. У наступному прикладі ми бачимо, як працює ця програма:
user $ readvar
Введіть число: a
Невірний введення, повторіть введення, будь ласка
Введіть число: 12
12
Після введення інформації за допомогою read весь вміст змінної віддаляється за допомогою підстановки параметрів, якщо послідовність включає будь-які символи, крім цифр, знаків «мінус» та пробілів. Правда, ця система контролю не ідеальна (відповідно до ній допускається як послідовність символів 12-34-5, так і 12 34), але все ж дуже ефективна.
#! /bin/sh
# Приклад readvar: зчитування числового значення
a= # Видалення вмісту змінної а
while [ -z "$a" ]; do echo -n "Введіть число: " read a a=${a##*[^0-9,' ',-]*} # Видалення послідовностей символів
# які містять будь які символи крім 0–9,
# знаку мінус та пробілу
if [ -z "$a" ]; then
echo "невірний ввід повторіть ввід будь ласка"
fi done echo $a
Умовні переходи та цикли в сценаріях bash
Умовні переходи в програмах оболонки створюються за допомогою команд if і case. У той час як if краще підходить для звичайних операцій вибору, case призначений для аналізу послідовностей символів (зіставлення зразків).
If - умовні переходи
У файлі iftst за допомогою if-запиту ми перевіряємо, чи були передані два параметри. Якщо цього не сталося, виводиться повідомлення про помилку. Програма завершується командою exit з повертається значенням, нерівним нулю (індикатор помилок). В іншому випадку вміст обох параметрів виводиться на екран.
#! / Bin / sh
# Приклад iftst if test $ # -ne 2; then
echo "Команді має бути передано рівно два параметри!"
exit 1 else
echo "Параметр 1: $ 1, Параметр 2: $ 2" fi
Короткий тестовий запуск показує, як працює програма: user $ iftst a
Команді має бути передано два параметри!
user $ iftst ab Параметр 1: a, Параметр 2: b
Критерієм для умовного переходу є результат останньої команди перед then. Якщо ця команда повертає значення 0, то умова виконується. Якщо then вказується в тому ж рядку, що і попередня команда (без переходу на наступну), то команда повинна завершуватися крапкою з комою.
Зверніть увагу, що значення істинності (true) в bash дорівнює 0, а хибності (false) - не дорівнює 0. У більшості інших мов програмування значення прямо протилежні! Команди, що завершуються без помилок, повертають значення 0. Будь-яке значення, не рівне 0, вказує на помилку. Деякі команди повертають різні значення в залежності від типу помилки.
У попередньому прикладі умова була створено за допомогою команди test оболонки bash. При цьому оператор -ne означає «не дорівнює» (not equal). Команда test застосовується щоразу, коли необхідно порівняти один з одним дві послідовності символів або два числа, коли необхідно перевірити, чи існує файл, і т. д.
Попередню програму можна було сформулювати інакше: замість test може використовуватися короткий варіант в квадратних дужках. При цьому перед назвою команди [і після неї] потрібно ставити пробіл.
Крім того, із структури if можна виокремити другу команду echo, оскільки через наявність команд exit всі рядки коду, що йдуть після fi, будуть виконуватися тільки після того, як буде виконано умову.
#! /bin/sh
# Приклад iftst, 2. варіант
if [ $# -ne 2 ]; then
echo " Команді потрібно передати два параметри!"
exit 1
fi
echo "Параметр 1: $1, Параметр 2: $2"
Дата добавления: 2015-04-11; просмотров: 64 | Поможем написать вашу работу | Нарушение авторских прав |