Інтерпретатор BASH
Bash - командний інтерпретатор що був створений Фондом вільно поширюваного програмного забезпечення у відповідності до специфікацій командного інтерпретатора та інструментальних засобів IEEE POSIX (IEEE POSIX Shell and Tools specification) (IEEE Working Group 1003.2). Bash - sh-сумісний інтерпретатор командної мови, що виконує команди, прочитані зі стандартного вхідного потоку або з файлу. Командний інтерпретатор bash також включає корисні засоби командних інтерпретаторів Korn і C.
Синтаксис інтерпретатора наступний: bash [опції] [файл]
ОПЦІЇ Крім однобуквених опцій командного інтерпретатора, представлених в описі вбудованої команди set, bash інтерпретує при виклику такі опції: -c рядок - якщо вказана опція-c, команди читаються з рядка. Якщо після рядка є аргументи, їх значення присвоюються позиційним параметрами, починаючи з $0. -R - якщо вказана опція-r, командний інтерпретатор стає обмеженим (див. "ОБМЕЖЕНОЮ командний інтерпретатор" нижче). -I - якщо вказана опція-i, командний інтерпретатор працює як інтерактивний. -S - якщо вказана опція-s або якщо після обробки опцій аргументів не залишається, команди читаються зі стандартного вхідного потоку. Ця опція дозволяє встановлювати позиційні параметри при виклику інтерактивного командного інтерпретатора. -D - Список всіх рядків у подвійних лапках з префіксом $ видається в стандартний вихідний потік. Це рядки, які необхідно перевести на відповідну мову, якщо поточна локаль відрізняється від C або POSIX. При цьому неявно передбачається опція-n; ніякі команди виконуватися не будуть. -- - Пара дефісів позначає кінець опцій і відключає їх подальшу обробку. Будь-які аргументи після - розглядаються як імена файлів і аргументи. Аргумент - еквівалентний --.
Командний інтерпретатор bash також інтерпретує кілька многосімвольних опцій. Ці опції, щоб вони були розпізнані, повинні зазначатися в командному рядку перед Односимвольний опціями.
- Dump-po-strings
Аналогічна опції-D, але результат видається у форматі GNU gettext po (portable object - переносимий об'єкт).
- Dump-strings
Аналогічна опції-D.
- Help
Видає в стандартний вихідний потік повідомлення про використання та успішно завершує роботу.
- Login
Змушує bash працювати так, як якби він був викликаний в якості початкового командного інтерпретатора (див. "ВИКЛИК" нижче).
- Noediting
Не використовує бібліотеку GNU readline для читання командних рядків в інтерактивному режимі.
- Noprofile
Не читає ні загальносистемний файл початкового запуску / etc / profile, ні будь-який з персональних файлів ініціалізації користувача ~ /. Bash_profile, ~ /. Bash_login або ~ /. Profile. За замовчуванням, bash читає ці файли при виклику в якості початкового командного інтерпретатора (див. "ВИКЛИК" нижче).
- Norc
Не читає і не виконує персональний файл ініціалізації ~ /. Bashrc, якщо командний інтерпретатор працює інтерактивно. Ця опція за замовчуванням включена, якщо інтерпретатор викликаний як sh.
- Posix
Змінює на стандартну поведінку bash в тих випадках, коли воно відрізняється від передбачуваного стандартом POSIX 1003.2.
- Rcfile файл
Виконує команди із зазначеного файлу замість стандартного персонального файлу ініціалізації ~ /. Bashrc, якщо командний інтерпретатор працює інтерактивно (див. "ВИКЛИК" нижче).
- Restricted
Командний інтерпретатор стає обмеженим (див. "ОБМЕЖЕНОЮ командний інтерпретатор" нижче).
- Verbose
Аналогічна опції-v.
- Version
Видає інформацію про версію даного екземпляра bash в стандартний вихідний потік і успішно завершує роботу.
АРГУМЕНТИ
Якщо після обробки опцій залишилися аргументи і не вказані опції-c або-s, перший аргумент вважається ім'ям файлу, що містить команди інтерпретатора. Якщо bash викликаний таким чином, параметр $ 0 встановлюється рівним імені файлу, а значеннями позиційних параметрів стають інші аргументи. Командний інтерпретатор bash читає і виконує команди з цього файлу, а потім завершує роботу. Статусом виходу bash є статус виходу останньої команди, виконаної в сценарії. Якщо жодна команда не виконана, статус виходу - 0. ВИКЛИК
Початковий командний інтерпретатор (login shell) - це інтерпретатор, перший символ нульового аргументу якого є дефісом (-) або який запущений з опцією - login.
Інтерактивним є командний інтерпретатор, стандартний вхідний і вихідний потоки якого підключені до терміналів (що визначається за допомогою функції isatty (3)), або запущений з опцією-i. Мінлива середовища PS1 встановлюється і прапори ($ -) включають i, тільки якщо bash є інтерактивним інтерпретатором, що дозволяє перевірити це у файлі початкового запуску або в сценарії командного інтерпретатора.
Наступні абзаци описують, як bash виконує свої файли початкового запуску. Якщо будь-який з цих файлів існує, але не може бути прочитаний, bash видає повідомлення про помилку. Символи тильди (~) в іменах файлів замінюються так, як описано в підрозділі "Заміна тильди" розділу "ЗАМІНИ".
При виклику bash як інтерактивного початкового командного інтерпретатора, або як неінтерактивному інтерпретатора з опцією - login, він спочатку читає і виконує команди з файлу / etc / profile, якщо цей файл існує. Після прочитання цього файлу, він послідовно шукає файли ~ /. Bash_profile, ~ /. Bash_login і ~ /. Profile, читає і виконує команди з першого ж з них, який існує і доступний для читання. Опція - noprofile може використовуватися при запуску командного інтерпретатора, щоб скасувати цю дію.
При завершенні роботи в якості початкового командного інтерпретатора bash читає і виконує команди у файлі ~ /. Bash_logout, якщо він існує.
При запуску інтерактивного командного інтерпретатора, який не є початковим, bash читає і виконує команди з файлу ~ /. Bashrc, якщо він існує. Цю дію можна скасувати за допомогою опції - norc. Опція - rcfile файл змушує bash читати і виконувати команди із зазначеного файлу замість ~ /. Bashrc.
При неінтерактивному запуску bash, наприклад, для виконання сценарію, командний інтерпретатор шукає в середовищі змінну BASH_ENV, отримує її значення і використовує його в якості імені файлу, який необхідно прочитати і виконати. bash поводиться так, як якщо б була виконана наступна команда:
if [-n "$ BASH_ENV"]; then. "$ BASH_ENV"; fi
але при пошуку імені файлу не використовується значення змінної PATH.
Якщо bash викликаний з ім'ям sh, він намагається, наколько це можливо, імітувати поведінку під час запуску старих версій інтерпретатора sh, відповідаючи при цьому стандарту POSIX. При виклик як інтерактивного початкового командного інтерпретатора або неінтерактивному, але з опцією - login, він спочатку намагається читати і виконувати команди послідовно з файлів / etc / profile і ~ /. Profile. Для відміни цієї дії можна використовувати опцію - noprofile. При виклик як інтерактивного командного інтерпретатора з ім'ям sh, bash шукає змінну середовища ENV, отримує її значення, якщо воно задано, і використовує це значення як ім'я файлу, який необхідно прочитати і виконати. Оскільки Лари, викликаний як sh, не намагається читати і виконувати команди в інших файлах початкового запуску, опція - rcfile не діє. Неінтерактивний команди інтерпретатор, викликаний з ім'ям sh, не намагається читати і виконувати ніякі файли початкового запуску. При виклику на ім'я sh, командний інтерпретатор bash входить в режим posix після прочитання файлів початкового запуску.
При запуску bash в режимі posix, наприклад, за допомогою опції командного рядка - posix, він слідує стандарту POSIX під час роботи з файлами початкового запуску. У цьому режимі інтерактивні командні інтерпретатори беруть значення змінної середовища ENV, читають і виконують команди з відповідного файлу. Ніякі інші файли початкового запуску не читаються.
Командний інтерпретатор bash намагається визначити, чи не запущений він демоном віддаленого командного інтерпретатора, звичайно, rshd. Якщо виявляється, що bash запущений демоном rshd, він читає і виконує команди з файлу ~ /. Bashrc, якщо цей файл існує і доступний для читання. Командний інтерпретатор bash так не робить, якщо запущений як sh. Для відміни цієї дії можна використовувати опцію - norc, а за допомогою опції - rcfile можна змусити читати інший файл, але зазвичай демон rshd не задає ці опції командного інтерпретатору і не дозволяє їх вказати.
Якщо командний інтерпретатор запущений з ефективним ідентифікатором користувача (групи), не збігається з реальним ідентифікатором користувача (групи), і не вказана опція-p, файли початкового запуску не читаються, функції командного інтерпретатора не успадковуються з середовища, мінлива SHELLOPTS, якщо вона задана в середовищі, ігнорується, а ефективний ідентифікатор користувача встановлюється рівним реальному. Якщо при виклику задана опція-p, файли початкового запуску теж не читаються, але ефективний ідентифікатор користувача не скидається. ВИЗНАЧЕННЯ
У частині документа використовуються наступні терміни. пробіл
Символ пробілу або символ табуляції.
слово
Послідовність символів, що розглядається командним інтерпретатором як єдине ціле. Також називається лексемою (token).
ім'я
Слово, що складається тільки з алфавітноціфрових символів і символів підкреслення, і починається з букви або символу підкреслення. Також називається ідентифікатором.
метасимвол
Символ, що розділяє слова, якщо він не замаскований. Один з таких символів: | &; () <> Пробіл табуляція
керуючий оператор
Лексема, що виконує функцію управління. Це один з наступних символів: | | & & &;;; () | <Переклад рядка>
Зарезервовані слова
Зарезервованими є слова, що мають спеціальне значення для командного інтерпретатора. Наступні слова розпізнаються як зарезервовані, якщо не замасковані і є або першим словом простий команди (див. "СИНТАКСИС КОМАНД" нижче), якою третьою словом команди case або for: ! case do done elif else esac fi for function if in select then until while {} time [[]] СИНТАКСИС КОМАНД
Прості команди
Проста команда - це завершується керуючим оператором послідовність необов'язкових присвоювання значень змінним, після яких йдуть слова, розділені пробілами, і перенаправлення потоків. Перше слово задає команду, яку треба виконати. Решта слова передаються як аргументи викликаної команді.
Повертаним значенням простої команди є її статус виходу, або 128 + n, якщо команда завершена сигналом n.
Конвеєри
Конвеєр - це послідовність однієї або більше команд, розділених символом |. Конвеєр має наступний формат:
[Time [-p]] [! ] Команда [| команда2 ... ]
Стандартний вихідний потік команди зв'язується зі стандартним вхідним потоком команди2. Цей зв'язок виконується раніше, ніж будь-які перенаправлення, що задаються командою (див. "перенаправлення" нижче).
Якщо перед конвеєром зазначено зарезервоване слово!, Статус виходу такого конвеєра є логічним запереченням статусу виходу останньої команди. В іншому випадку, статус виходу конвеєра збігається зі статусом виходу останньої команди. Перш, ніж повертати значення, командний інтерпретатор чекає завершення всіх команд в конвеєрі.
Якщо перед конвеєром йде зарезервоване слово time, після завершення конвеєра видається загальне, користувальницьке і системний час, витрачений на його виконання. Опція-p змінює формат виводу на задається стандартом POSIX. Мінлива TIMEFORMAT може задавати рядок формату видачі інформації про час; див. опис змінної TIMEFORMAT в розділі "Змінні командного інтерпретатора" нижче.
Кожна команда в конвеєрі виконується як окремий процес (тобто у породженому інтерпретаторі).
Списки
Список - це послідовність одного або більше конвеєрів, розділених одним з операторів;, &, & & або | |, і не обов'язково завершується одним з операторів;, & або <переклад рядка>.
З цих операторів списку & & і | | мають рівний пріоритет, причому більший, ніж, і &, що теж мають рівний пріоритет.
Якщо команда завершується керуючим оператором &, інтерпретатор виконує команду у фоновому режимі в породженому інтерпретаторі. Командний інтерпретатор не чекає завершення команди, а статус виходу в цьому випадку - 0. Команди, розділені; виконуються послідовно; командний інтерпретатор чекає черзі завершення кожної з команд. Статус повернення списку в цьому випадку співпадає зі статусом повернення останньої виконаної команди.
Керуючі оператори & & і | | позначають, відповідно, І-списки та АБО-списки. І-список має вигляд команда & & команда2
Команда2 виконується тільки і якщо тільки команда повернула статус виходу нуль.
АБО-список має вигляд команда | | команда2
Команда2 виконується тільки і якщо тільки команда повернула ненульовий статус виходу. І-і АБО-списки повертають статус останньої команди, виконаної в списку.
Складові команди
Складовими називають наступні команди: (Список) Список виконується у породженому командному інтерпретаторі. Присвоювання змінним і вбудовані команди, що впливають на середу командного інтерпретатора, не діють після завершення команди. Статусом повернення є статус виходу списку.
{Список;} Список просто виконується в середовищі поточного командного інтерпретатора. Список повинен завершуватися перекладом рядки або крапкою з комою. Цю команду називають командою угруповання. Статусом повернення є статус виходу списку.
((Вираз)) Вираз обчислюється відповідно до правил, описаними нижче у розділі "обчислення арифметичних виразів". Якщо вираз має ненульове значення, статус повернення дорівнює 0; в іншому випадку - 1. Ця конструкція еквівалентна конструкції let "вираз".
Вираз Повертає статус 0 або 1 залежно від значення зазначеного умовного виразу. Вирази складаються з компонентів, описаних нижче в розділі "УМОВНІ ВИРАЖЕННЯ". Розподіл слів і підстановка імен файлів в словах між і не виконується; виконується заміна тильди, підстановка значень параметрів і змінних, арифметична підстановка, підстановка результатів команд і підстановка процесів, а також видалення лапок.
При використанні операторів == і! = Рядок праворуч оператора вважається зразком і зіставляється за правилами, описаним нижче в підрозділі "Зіставлення зі зразком". Повертається значення 0 якщо рядок, відповідно, зіставляється і не зіставляється із зразком, та 1 в іншому випадку. Будь-яка частина зразка може бути взята в лапки, щоб зіставлення з нею йшло буквально.
Вирази можна комбінувати з допомогою наступних операторів, перерахованих в порядку зниження пріоритету: (Вираз) Повертає значення виразу. Круглі дужки можна використовувати для зміни звичайного пріоритету операторів.
! вираз Істинно, якщо вираз помилково.
вираз1 & & вираз2 Істинно, якщо істинні обидва вирази, вираз1 і вираз2.
вираз1 | | вираз2 Істинно, якщо істинно вираз1 або вираз2.
Оператори & & і | | не обчислюють вираз2, якщо значення вираженія1 достатньо для визначення значення, що повертається всього умовного виразу.
for ім'я [in спісок_слов]; do список; done Виконуються підстановки в спіске_слов після in, в результаті чого виходить список елементів. Змінна з відповідним ім'ям послідовно отримує значення кожного елемента цього списку, і щоразу виконується список. Якщо слово in не вказано, команда for виконує список для кожного встановленого позиційного параметра (див. розділ "ПАРАМЕТРИ" нижче). Сатусом повернення є статус виходу останньої виконаної команди. Якщо в результаті підстановки елементів спіска_слов після in виходить порожній список, команди не виконуються і повертається статус 0.
select ім'я [in спісок_слов]; do список; done Виконуються підстановки в спіске_слов після in, в результаті чого виходить список елементів. Набір отриманих після підстановки слів видається в стандартний потік помилок, причому перед кожним елементом видається його порядковий номер. Якщо слово in не вказано, видаються встановлені позиційні параметри (див. розділ "ПАРАМЕТРИ" нижче). Потім видається запрошення PS3 і читається рядок зі стандартного вхідного потоку. Якщо цей рядок містить число, відповідне одному з виданих слів, то змінна ім'я отримує його значення. Якщо рядок порожній, слова і запрошення видаються знову. Якщо прочитаний символ кінця файлу (EOF), команда заврешается. При введенні будь-якого іншого значення мінлива ім'я отримує пусте значення. Прочитана рядок зберігається у змінній REPLY. Список виконується після кожного вибору, поки не буде виконана команда break або return. Статусом виходу команди select є статус виходу останньої команди у списку, або 0, якщо жодна команда не була виконана.
case слово in [(зразок [| зразок] ...) список;;] ... esac Команда case спочатку підставляє значення слова і намагається його зіставити по черзі з кожним зразком, використовуючи ті ж правила зіставлення, що і для імен файлів (див. підрозділ "Підстановка імен файлів"). Якщо знайдено сопоставляющий зразок, виконується відповідний список. Після знаходження першого зіставлення подальше зіставлення не виконується і команда завершується. Статус виходу дорівнює 0, якщо жоден зразок не зіставити. В іншому випадку, він дорівнює статусу виходу останньої виконаної команди з відповідного списку.
if список; then список; [elif список; then список;] ... [Else список;] fi Виконується список після if. Якщо його статус виходу - 0, виконується список після then. В іншому випадку, виконується послідовно список в черговий конструкції elif, і якщо його статус виходу - 0, виконується відповідний список після then і команда завершується. Якщо всі конструкції elif перевірені і жоден зі списків не повернув статус 0, виконується список після else, якщо ця конструкція задана. Статусом виходу є статус виходу останньої виконаної команди або 0, якщо жодна з умов не виявилося істинним.
while список; do список; done until список; do список; done Команда while циклічно виконує список після do, поки остання команда списку повертає статус виходу 0. Команда until ідентична команді while, але умова завершення - протилежно; список після do виконується, поки остання команда списку повертає ненульовий статус виходу. Статусом виходу команд while і until є статус виходу останньої виконаної команди списку або 0, якщо жодна команда не виконана.
[Function] ім'я () {список;} Ця команда визначає функцію із зазначеним ім'ям. Тіло функції утворює список команд між фігурними дужками {і}. Цей список виконується кожного разу, коли ім'я функції вказується як ім'я простий команли. Статусом виходу функції є статус виходу останньої команди, виконаної в тілі функції. (Див. "ФУНКЦІЇ" нижче.)
КОМЕНТАРІ
У неінтерактивному командному інтерпретаторі або в інтерактивному з включеною опцією interactive_comments вбудованої команди shopt (див. розділ "ВБУДОВАНІ команди інтерпретатор" нижче), слово, що починаються символом #, тягне ігнорування цього слова і наступних символів у рядку. Інтерактивний командний інтерпретатор з не включеною опцією interactive_comments не допускає використання коментарів. Опція interactive_comments за замовчуванням включається в інтерактивних командних інтерпретатора. МАСКУВАННЯ
Маскування (quoting) використовується для скасування спеціального значення для командного інтерпретатора певних символів або слів. Маскування можна використовувати для скасування специфічної обробки спеціальних символів, для запобігання розпізнавання зарезервованих слів, а також для запобігання підстановки параметрів.
Кожен з метасимволів, перерахованих вище в розділі "ВИЗНАЧЕННЯ", має спеціальне значення для командного інтерпретатора і повинен маскуватися, якщо використовується буквально. Є три механізми маскування: символ маскування (escape character), одиночні лапки і подвійні лапки.
Незамасковані зворотна коса риска (\) є символом маскування. Він вимагає використовувати наступний за ним символ (за винятком переведення рядка) буквально. Якщо введена пара символів \ <переведення рядка> та сама зворотна коса не замаскований, ця пара обробляється як ознака продовження рядка (тобто вона видаляється з вхідного потоку і, по суті, ігнорується).
Усі символи в одиночних лапках використовуються буквально. Символ одиночній лапки (апостроф) не повинен вказуватися між поодинокими лапками, навіть якщо він передує зворотної косою.
Символи в подвійних лапках використовуються буквально, за винятком символів $, `і \. Символи $ і `в подвійних лапках мають те ж спеціальне значення. Зворотна коса має спеціальне значення тільки якщо після неї йде один з наступних символів: $, `,", \ або <переклад рядка>. Подвійну лапки можна вказувати в подвійних лапках, замаскувавши зворотної косою.
Спеціальні параметри * і @ мають спеціальне значення за умов згадування в подвійних лапках (див. розділ "ПАРАМЕТРИ" нижче).
Слова виду $ 'рядок' обробляються особливим образомy. Слово замінюється рядком, в якій упереджені зворотної косою символи замінюються відповідно до стандарту ANSI C. Керуючі послідовності, що починаються зі зворотної косою, декодуються наступним чином: \ a тривога (дзвінок) \ B забій \ E керуючий символ \ F прогін сторінки (form feed) \ N переклад рядка (new line) \ R carriage return (повернення каретки) \ T табуляція \ V вертикальна табудяція \ \ Зворотна коса \ Nnn символ, ASCII-код якого збігається з вісімковим значенням nnn (від однієї до трьох цифр) \ Xnnn символ, ASCII-код якого збігається з шістнадцятковим значенням nnn (від однієї до трьох цифр)
Перетворений результат поміщається в одиночні лапки, як якщо б символу долара просто не було.
Рядок у подвійних лапках, перед якою йде символ долара ($), буде перетворена відповідно до поточної локаллю. Якщо поточна локаль - C або POSIX, символ долара ігнорується. Якщо рядок перетворена і замінена, результат поміщається в подвійні лапки.