GNU Bash-3.0 (2004 серпень 26)
{{TODO}} {{FINISH}}
НАЗВА
bash - GNU Bourne-Again SHell (Ще одна оболонка GNU Bourne)
ВИКОРИСТАННЯ
bash [опції] [файл]
АВТОРСЬКІ ПРАВА
Bash is Copyright © 1989-2004 by the Free Software Foundation, Inc
ОПИС
Bash є sh-сумісним інтерпретатором мови команд, що виконує команди прочитані зі стандартного потоку вводу чи з файлу. Bash також включає корисні риси з оболонок Korn та C (ksh та csh).
Bash є спробою відповідної реалізації специфікації IEEE POSIX Shell and Tools (Робоча Група IEEE 1003.2)
КЛЮЧІ
На додачу до односимвольних ключів оболонки, перелічених в опису до вбудованої команди set, bash розуміє наступні ключі під час виклику:
-c рядок : Якщо наявний ключ -c, команди зчитуються з рядка. Якщо після рядка є арґументи, вони призначаються позиційним параметрам, починаючи з $0.
-i : Якщо присутній ключ -i, оболонка стає інтерактивною.
-l : Примушує bash діяти так, ніби вона запущена в режимі login (дивись ?ВИКЛИК| нижче).
-r : При наявності ключа -r оболонка стає обмеженою (дивись розділ ?ОБМЕЖЕНА ОБОЛОНКА| нижче).
-s : При наявності ключа -s, або якщо після обробки ключів не залишається арґументів, тоді команди зчитуються зі стандартного пристрою вводу. Цей ключ дозволяє встановити позиційні параметри під час виклику оболонки в інтерактивному режимі.
-D : Перелік всіх подвійно-екранованих рядків, що починаються з $, виводяться на стандартний пристрій виводу. Ці рядки є предметом перекладу, коли поточна локаль не є C або POSIX. Цей ключ неявно вмикає ключ -n; команди не будуть виконуватися.
-+O [shoptключ] : shoptключ — один з ключів оболонки, допущених для вбудованої команди shopt. Якщо присутній shoptключ, то -О вмикає його, а +О — вимикає. Якщо shoptключ не вказаний, назви та значення ключів оболонки, що приймаються командою shopt, друкуються на стандартному пристрої вводу. Якщо вказана +О, те, що на виході, зображується в форматі, що може бути потім використаний для вводу.
--
: Припиняє обробку ключів. Усі арґументи, що залишилися в командному рядку після цього ключа, трактуються як назва файлу й арґументи. Арґумент — еквівалентний --.
Bash також розуміє декілька багатосимвольних ключів. Для того, щоб ці ключі були впізнані оболонкою, необхідно їх розмістити в командному рядку перед односимвольними ключами.
--dump-po-strings : Цей ключ дорівнює -D, але рядки видаються в форматі GNU gettext po.
--dump-strings : Еквівалент -D.
--help : Показує повідомлення про використання на стандартному пристрої виводу та виходить з успішним станом.
--init-file файл
--rcfile файл : Виконує команди з 'файлу' замість стандартного особистого файлу ініціалізації ~/.bashrc, коли оболонка в інтерактивному режимі (дивись ?ВИКЛИК| нижче).
--login : Еквівалент -l.
--noediting : Не використовувати бібліотеку GNU readline для читання командних рядків ув інтерактивному режимі роботи оболонки.
--noprofile : Не виконувати ні системний файл ініціалізації /etc/profile, ні особисті файли ініціалізації ~/.bash_profile, ~/.bash_login чи ~/.profile. За вмовчанням, bash зчитує ці файли, коли вона викликається у режимі login (дивись ?ВИКЛИК| нижче).
--norc : Не зчитує та не виконує особистий файл ініціалізації ~/.bashrc, коли оболонка в інтерактивному режимі. Цей ключ увімкнено за вмовчанням, якщо оболонка викликається як sh.
--posix : Змінює поведінку bash в тих випадках, коли типові дії bash відмінні від стандарту POSIX 1003.2, в бік відповідності до стандарту (режим posix).
--rpm-requires : Створює список файлів, що необхідні для роботи скрипта оболонки. Ця опція означає ввімкнення -n. Опція має деякі обмеження, такі як перевірка помилок часу компіляції, не проводиться розбір обернених лапок, [], test, тому деякі залежності можуть бути втрачені.
--verbose : Теж саме, що -v
--version : Показує інформацію про версію цього примірника bash на стандартному пристрої вводу та виходить з успішним статусом.
АРҐУМЕНТИ
Якщо після розбору ключів у командному рядку ще залишаються арґументи та не було вказано ні -c, ні -s, перший арґумент вважається назвою файлу, що містить команди оболонки (назвою файлу скрипта). В такому випадку, оболонка встановлює параметром $0 назву командного файлу, іншим позиційним параметрам надаються значення арґументів, що залишилися у командному рядку після назви командного файлу. Bash зчитує та виконує команди з цього файлу, потім виходить. Bash встановлює свій стан виходу рівним станові останньої команди в скрипті, що була виконана. Якщо bash не виконав жодної команди, стан виходу встановлюється у 0. Спочатку оболонка намагається відкрити файл у поточному каталозі й, якщо такого файлу немає, вона шукає цей файл у каталогах, що вказані у змінній PATH.
ВИКЛИК
Початкова оболонка (login shell) — це оболонка, при виклику якої перший символ нульового аргументу встановлено у «-», чи було вказано ключ --login.
Інтерактивна оболонка — це оболонка, запущена без аргументів, що не є ключами, та без ключа -с, пристрої стандартного вводу та виводу якої підключені до терміналів (визначається викликом до ?isatty(3), або якщо при виклику було вказано ключ -i. Якщо оболонка запущена інтерактивно, встановлюється змінна PS1, а змінна $- включає i (як підрядок), дозволяючи скриптові оболонки чи файлові запуску (startup file) перевірити цей стан.
Наступні абзаци описують, як 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, якщо цей файл існує та може бути прочитаний. Вона не буде цього робити, коли викликана командою sh. Ключ --norc використовується для заборони цієї поведінки, а ключ --rcfile може використовуватися для вказівки використання іншого файлу запуску, але rshd зазвичай не викликає оболонку з цими ключами та не дозволяє їх вказати.
Якщо оболонка викликана у випадку, коли діючий ідентифікатор користувача або групи не співпадає зі справжнім, а ключ -p не було вказано, файли запуску не викликаються, функції оболонки не вспадковуються з середовища, змінна SHELLOPTS, якщо вона наявна в середовищі, нехтується, а діючий ідентифікатор користувача прирівнюється до реального. Якщо вказати ключ -p, поведінка при запуску не змінюється, однак діючий ідентифікатор користувача не скидається.
ВИЗНАЧЕННЯ
В цьому документі використовуються наступні визначення:
| & ; ( ) < > пропуск табуляція | || & && ; ;; ( ) <новий рядок>
прогалина(blank) : Пропуск чи табуляція.
слово : Послідовність символів, яку оболонка трактує цілісною одиницею. Також використовується термін лексема.
ім'я : Слово, що містить тільки цифри, літери та символ підкреслювання та починається з літери чи символу підкреслювання. Також використовується термін ідентифікатор.
метасимвол
: Символ, що ззовні екранування розділяє слова:
керуючий символ
: Лексема, що виконує функцію керування:
ЗАРЕЗЕРВОВАНІ СЛОВА
Зарезервовані слова - слова, що мають спеціальне значення для оболонки. Наступні слова є зарезервованими, коли використовуються ззовні екранування та коли використовуються в якості першого слова простої команди або третього слова команд case чи for:
! case do done elif else easc fi for function if in select then until while { } time ?
ГРАМАТИКА ОБОЛОНКИ
Прості команди
Проста команда - це послідовність необов'язкових присвоєнь змінним, з наступними розділеними прогалинами словами та перепризначеннями, що завершується керуючим символом. Перше слово задає команду для виконання та передається як арґумент нуль. Решта слів передаються арґументами для запущеної команди.
Повернене значення простої команди є станом її завершення, або 128+n, якщо команда перервана сигналом n.
Конвеєри
Конвеєр - це послідовність з однієї чи кількох команд, розділених символом |. Формат конвеєра такий:
[time [-p]] [ ! ] команда [ | команда2 ... ]
Стандартний вивід команди під'єднується до стандартного вводу команди2. Це з'єднання відбувається до перенаправлень, що були вказані у команді (дивись ?ПЕРЕНАПРАВЛЕННЯ| нижче).
Якщо зарезервоване слово ! передує конвеєру, статус виходу цього конвеєру логічне заперечення статусу виходу останньої команди. У іншому випадку, статус виходу є статусом виходу останньої команди (без заперечення). Оболонка чекає припинення роботи всіх команд в конвеєрі перед виходом.
Якщо зарезервоване слово time передує конвеєру, загальний час виконання команди, а також час користувача та системи, що був використаний на виконання звітується по виході з конвеєру. Опція -p змінює формат представлення на відповідний до стандарту POSIX. Змінна TIMEFORMAT задає формат представлення інформації про час (Дивись опис TIMEFORMAT у розділі ?Змінні Оболонки| нижче).
Кожна команда у конвеєрі виконується як окремий процес (тобто у підоболонці).
Списки
список - послідовність одного або більше конвеєрів розділених одним з операторів ;, &, &&, ||, та (необов'язково) закінчуються ;, & або новим рядком.
Поміж цих операторів списку, && та || мають однаковий пріоритет, за ним йдуть оператори ; та &, що також мають однаковий пріоритет.
Для розмежування команд замість коми з крапкою у списку може використовуватись послідовність з одного чи декількох символів нового рядку.
Коли команда закінчується керуючим оператором &, оболонка виконує цю команду в фоні в підоболонці. Оболонка не чекає завершення виконання команди та повертає код статусу 0. Команди, що розділяються ; виконуються послідовно; оболонка чекає завершення кожної команди в порядку черги. Повертається код статусу останньої виконуваної команди.
Оператори керування && та || позначають І списки та АБО списки, відповідно.
І список має форму
команда1 && команда2
Команда2 виконується тоді і тільки тоді, коли команда1 повертає нульовий статус. АБО список має форму
команда1 || команда2
Команда2 виконується тоді і тільки тоді, коли команда1 повертає ненульовий статус.
Код статусу, що повертається І та АБО списками - код статусу останньої виконуваної команди в списку.
Складені команди
Складена команда - це одна з наступних команд:
список
: Список виконується у підоболонці. Присвоєння змінних та вбудовані команди, що впливають на середовище оболонки не зберігаються після завершення команд у списку. Повертається код статусу останньої команди у списку.
{ список ; }
: Список просто виконується у поточному середовищі оболонки. Список повинен закінчуватися символом нового рядку чи крапкою з комою. Повертається код статусу списку. Зауважте, що на відміну від метасимволів ( та ), { та } є зарезервованими словами і тому повинні вживатися там, де дозволено використання зарезервованих слів. Вони повинні розмежовуватися від списку прогалиною, оскільки не є символами розмежування слів.
(( вираз ))
: Вираз оцінюється відповідно до правил описаних в розділі ARITHMETIC EVALUATION. Якщо значення виразу ненульове, повертається значення 0, у іншому випадку повертається 1. Ця команда повністю еквівалентна до let " вираз "
?** вираз **
: Повертає статус 0 чи 1 в залежності від оцінювання умовного виразу вираз.
Вирази складаються з primaries, що описані у розділі ?УМОВНІ ВИРАЗИ|.
Розділення слів та розширення шляхів не проводится у словах між ?** та **. Проводиться розширення символів тильда, параметрів та змінних,
арифметичне розширення, підстановка команд, підстановка процесів, та видалення лапок.
При використанні операторів == та != рядок праворуч від оператора вважається трафаретом (pattern) та співставляється відповідно до правил описаних у розділі ?Співставлення Tрафаретів|. Повертається значення 0 у випадку, коли рядок співставляється з трафаретом, і 1 у іному випадку. Будь яка частина трафарету може бути взята в лапки для того, щоб вона співставлялась як рядок.
Вираз може бути комбінованим з використанням наступних операторів, що перелічені у порядку зменшення пріоритету:
: ( вираз )
: Повертає значення виразу. Використовується для зміни нормального пріоритету операторів у виразі
: ! вираз
: Правда, коли вираз є неправдою.
: вираз1 && вираз2
: Правда, коли обидва вираз1 та вираз2 правдиві.
: вираз1 || вираз2:
: Правда, коли хоча б один з вираз1 або :вираз2 правдивий.
Оператори && та || не обчислюють вираз2, коли значення вираз1 достатнє для визначення значення складеного умовного виразу.
for назва [ in слова ] ; do список ; done
: Список слів, що слідкують за in розширюється, створюючи список елементів. Значення змінної з ім'ям назва встановлюється рівним значенню кожного елемента в цьому списку та список виконується при кожному присвоєнню Якщо слово пропущене команда виконує список для кожного позиційного параметра (дивись розділ ?ПАРАМЕТРИ|). Код статусу, що повертається, встановлюється рівним статусу виходу останньої виконаної команди. Якщо розширення елементів, що слідкують за in отримує пустий список, команди не виконуються та повертається значення 0.
for (( вираз1 ; вираз2 ; вираз3 )) ; do список ; done
: Спочатку, арифметичний вираз вираз1 оцінюється відповідно до правил, що описані нижче у розділі ?ОБЧИСЛЕННЯ АРИФМЕТИЧНИХ ВИРАЗІВ|. Потім оцінюється арифметичний вираз вираз2 у циклі до того часу поки він не оціниться до 0. Кожного разу, коли вираз2 оцінюється до ненульового значення виконується список та оцінюється значення арифметичного виразу вираз3. Якщо будь-який з виразів опущено, команда поводиться так, ніби він оцінюється до 1. Повертається статус виходу останньої виконаної команди, або хибний статус, якщо не було виконано жодної команди.
select змінна [ in слова ] ; do список ; done
: Список слів, що слідкують за in розширюється, створюючи список елементів. Набір розширених слів друкується на стандартному пристрої помилок. Перед кожним словом друкується число. Якщо in слова не було вказано, друкуються позиційні параметри (дивись розділ ?ПАРАМЕТРИ|). Потім зображується підказка PS3 та зчитується рядок зі стандартного вводу. Якщо рядок містить число, що відповідає одному з зображених слів, значення змінної змінна встановлюється рівним вибраному слову. Якщо рядок пустий слова та підказка друкується знову. Якщо зчитано EOF, команда завершує свою роботи. Будь яке інше значення прочитане в рядку спричиняє встановлення змінної змінна в null. Прочитаний рядок зберігається у змінній REPLY. Список виконується після кожного вибору аж поки не буде виконано команду break. Статус виходу select встановлюється рівним статусу виходу останньої виконаної команди у списку, або нулю, якщо не було виконано команд.
case слово in [ [(] трафарет [ | трафарет ] ... ) список ;; ] ... esac
: Спочатку команда case розширює слово та намагається співставити до кожного трафарета по порядку, використовуючи ті ж самі правила, що й для розширення назв шляху (дивись ?Рокриття Назв Шляхів|). Коли знаходиться співставлення, виконується відповідний список. Після першого співставлення не робиться спроби подальших співставлень. Статус виходу 0, якщо не було знайдено співставлення. В іншому випадку статус виходу встановлюється рівним статусу виходу останньої виконаної команди в списку.
if список ; then список ; [ elif список ; then список ; ] ... [ else список ; ] fi
: Виконується if список. Якщо його статус виходу нуль, тоді виконується then список. У іншому випадку, кожен elif список виконується по порядку, і якщо його статус виходу нуль, виконується відповідний then список та команда завершує свою роботу. У іншому випадку виконується else список, ящко він присутній. Код виходу рівний коду виходу останньої виконаної команди, або нуль, якщо всі перевірені умови не справдились.
while список ; do doсписок ; done
until список ; do doсписок ; done
: Команда while безперервно виконує doсписок, поки список не поверне нульове значення. Команда until безперервно виконує doсписок, поки список не поверне ненульове значення. Значення статусу виходу команд while та until рівне статусу виходу останньої виконаної команди, або нуль, якщо жодної команди не було виконано.
Визначення функцій оболонки
Функції оболонки є об'єктами, що викликаються як прості команди та виконують складену послідовність команд з новими ситуативними параметрами. Функції визначаються наступним чином:
[ function ] назва () { список ; }
: Визначає функцію, що називається назва. Тіло функції - список команд між { та }. Цей список виконується, коли назва вказана як назва простої команди. Статус виходу функції - статус виходу останньої команди, що була виконана в тілі функції. (Дивись розділ ?ФУНКЦІЇ| нижче).
КОМЕНТАРІ
В оболонці, що не є інтерактивною, або в інтерактивній оболонці, в якій опція interactive_comments до вбудованої команди shopt ввімкнена (дивись ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ|), слово, що починається з # спричиняє ігнорування цього слова та всіх символів у рядку, що залишилися після цього слова. Інтерактивна оболонка без ввімкненої опції interactive_comments не дозволяє коментарів. В інтерактивній оболонці за замовчуванням опція interactive_comments ввімкнена.
ЕКРАНУВАННЯ
Екранування (quoting) застосовується для того щоб позбавитись спеціального значення деяких знаків або слів для оболонки. Екранування може бути застосовано для позбавлення певної інтерпретації спеціальних знаків, для запобігання того щоб зарезервовані слова сприймались зарезервованими, також щоб запобігти розширенню параметрів.
Кожний із метазнаків у попередньому переліку під секцією ?ВИЗНАЧЕННЯ| має спеціальне значення для оболонки повинен бути екранованим для того щоб відображати самих себе.
Коли застосовуються засоби доповнення команд з історії, відповідний спеціальний знак, звичайно !, повинен бути звільнено для того щоб запобігти вживанню команд з історії.
Існує три механізми екранування: знак запобігання, одинарні лапки і подвійні лапки.
Не взятий у лапки обернений слеш (**) є знаком запобігання. Він зберігає буквальне значення знака що слідує за ним за винятком <нової лінії>. Якщо *<нова лінія> пара має місце і обернений слеш сам по собі не є екрановано, в такому випадку ***<нова лінія> сприймається як продовження тієї самої лінії (тобто нова лінія вилучається із потоку вводу і ефективно ігнорується).
Включення знаків у одинарні лапки зберігає буквальне значення кожного знаку всередині лапок. Одинарні лапки не можуть з'являтися всередині одинарних лапок, навіть із передуючим оберненим слешом.
Включення знаків у подвійні лапки зберігає буквальне значення кожного знаку всередині лапок за винятком $, ** та **\**. Знаки **$** та **
зберігають їхнє спеціальне значення всередині подвійних лапок. Обернений слеш зберігає своє спеціальне значення якщо за ним слідує один із наступних знаків: $, `, ", ** або <нова лінія>. Подвійні лапки можуть бути екрановані всередині подвійних лапок з допомогою попереднього оберненого слешу.
Спеціальні параметри * та @ набувають спеціального значення коли знаходяться всередині подвійних лапок (дивись ?ПАРАМЕТРИ| нижче). Слова у вигляді $'рядок' сприймаються як спеціальні. Таке слово розкривається у рядок, екрановані оберненим слешом знаки при цьому замінюються так як описано у ANSI C стандарті. Послідовності, екрановані оберненим слешом, якщо присутні, розшифровується як наступне:
: \a сигнал (дзвоник)
: \b крок назад (із стиранням)
: \e знак перемикача коду
: \f зміна сторінки
: \n нова лінія
: \r повернення каретки
: \t горизонтальна табуляція
: \v вертикальна табуляція
: \ обернений слеш
: \' одинарна лапка
: **nnn восьми-бітовий знак чиє значення є значенням октету nnn (одна до трьох цифр)
: \xHH восьми-бітовий знак чиє значення є значенням шістнадцяткового HH (одна або дві шістнадцяткових цифри)
Розвернений результат буде залапковано в одинарні лапки, виглядатиме так ніби знак долару навіть не був присутній.
Рядок у подвійних лапках із попереднім знаком долару ($) призведе до того що рядок буде інтерпретовано відповідно до теперішньої локалі. Якщо поточна локаль C або POSIX, знак долару буде ігноровано. Якщо рядок переведено та замінено, заміна буде залапкована у подвійні лапки.
ПАРАМЕТРИ
Параметр є одиницею що утримує значення. Параметром може бути назва, число або один із спеціальних знаків, перечислених нижче у ?Спеціальних Параметрах|. Для цілей оболонки, змінна є параметром позначеним назвою. Змінна має значення і нуль або більше атрибутів. Атрибути надаються за допомогою declare вбудованої команди (дивись declare у ?ВБУДОВАНИХ КОМАНДАХ ОБОЛОНКИ|).
Параметр встановлено якщо йому було надано значення. Нульовий рядок є прийнятним значенням. Як тільки змінна була встановлена, вона може бути скасована лише unset вбудованою командою (дивись ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче).
Змінній може бути надано значення виразом у формі
_ім'я_=[_значення_]
Якщо значення не надано, змінній призначається нульовий рядок. Всі значення підлягають розкриттю тильди, розкриттю параметрів і змінних, командній заміні, арифметичному розкриттю і вилученню екранування (дивись ?РОЗКРИТТЯ| нижче). Якщо змінна має встановленим integer атрибут, тоді значення підлягатиме арифметичному розширенню, навіть якщо $((...)) нотація не застосовується (дивись ?Арифметичне Розкриття| нижче). Розділення слів не виконується, за винятком "$@", так як пояснено нижче у ?Спеціальних Параметрах|. Розкриття шляху не виконується. Вирази присвоєння також можуть з'являтись у вигляді аргументів до declare, typeset, export, readonly та local вбудованих команд.
Позиційні Параметри
Позиційним параметром є параметр позначений одним або більше числом, за винятком одного числа 0. Позиційні параметри передаються із аргументів оболонки, коли вона запускається, і можуть бути призначені знова, використовуючи set вбудовану команду. Позиційні параметри не можуть отримувати значення з допомогою виразу присвоєння. Позиційні параметри тимчасово заміняються коли виконується функція (дивись ?ФУНКЦІЇ| нижче).
Коли позиційний параметр, що складається більш ніж із однієї цифри, розкрито, він повиннен бути включений у фігурні дужки (дивись ?РОЗКРИТТЯ| нижче).
Спеціальні Параметри
Оболонка розглядає декілька параметрів як спеціальні. На ці параметри можна лише посилатись, присвоєння нового значення їм не дозволене.
*
: Розширюється до позиційних параметрів, починаючи з першого. Коли розширення відбувається всередині подвійних лапок, воно виглядає як одне слово із значеннями кожного параметру, розділеними першим знаком IFS спеціальної змінної. Тобто "$*" є еквіваленим "$1c$2c...", де c буде першим знаком значення що утримує IFS. Якщо IFS скасована (unset), параметри будуть розділені пробілом. Якщо IFS має невизначене значення (null), параметри зіллються в одне слово з-за відсутності розділювача.
@
: Розширюється до позиційних параметрів, починаючи з першого. Коли вираз має місце всередині подвійних лапок, кожний параметр розширюється до окремого слова. Тобто, "$@" є еквівалентним "$1" "$2" ... Якщо немає позиційних параметрів, "$@" та $@ розширюються до нічого (тобто вони видаляються).
#
: Розширюється до кількості позиційних параметрів, у вигляді десяткового числа.
?
: Розширюється до статусу найостаннішого виконаного конвеєру із пріоритетною дією.
-
: Розширюється до прапорців опцій які були дійсні під час виклику оболонки, і встановлені set вбудованою командою, або тих які оболонка сама встановила (-i опція, наприклад).
$
: Розширюється до ID процесу оболонки. У () оболонці другого рівня розширюється до ID процесу дійсної оболонки, а не підоболонки.
!
: Розширюється до ID процесу останньої виконаної фонової (асинхронної) команди.
0
: Розширюється до назви оболонки або самого скрипту. Це встановлюється при ініціалізації оболонки. Якщо bash викликано файлом з командами, $0 буде утримувати назву цього файлу. Якщо bash викликано із -c опцією, тоді $0 отримує значення першого аргументу після рядка що повинен бути виконано, якщо аргумент присутній. Якщо ні, тоді $0 набуває значення самого файлу що викликає bash із відсутнім аргументом.
_
: При старті оболонки набуває значення абсолютного шляху до файлу самої програми оболонки або шел скрипту що виконується якщо такий був наданий у списку аргументів. Згодом розширюється до останнього аргументу попередньої команди. Також розширюється до повної назви кожної команди що виконана і поміщена у середовище експортоване цій команді . Коли перевіряється пошта, цей параметр утримує назву файлу пошти яка розглядається на даний момент.
Змінні Оболонки
Наступні змінні встановлено оболонкою:
BASH : Розширюється до повної назви файлу що започаткував цей окремий випадок bash.
BASH_VERSINFO : Змінна масиву, для читання тільки, яка утримує версію оболонки яка в даний момент діє. Значення присвоєні елементам масиву є наступними:
: BASH_VERSINFO[0] Головне число версії (the release).
: BASH_VERSINFO[1] Другорядне число версії (the version).
: BASH_VERSINFO[2] Версія латки.
: BASH_VERSINFO[3] Версія побудови.
: BASH_VERSINFO[4] Статус релізу (наприклад beta1).
: BASH_VERSINFO[5] Значення MACHTYPE.
BASH_VERSION : Розширюється до рядка що описує версію діючої оболонки.
COMP_CWORD : Індекс у ${COMP_WORDS} слова яке утримує теперішню позицію курсора. Ця змінна доступна тільки у функціях оболонки викликаних засобами програмованого вивершення (дивіться ?Програмоване Вивершення| нижче).
COMP_POINT : Індекс теперішньої позиції курсора відносно початку теперішньої команди. Якщо теперішня позиція курсора знаходиться в кінці поточної команди, то значення змінної дорівнює ${#COMP_LINE}. Ця змінна доступна тільки у функціях оболонки та зовнішніх командах викликаних програмованими засобами вивершення (дивіться ?Програмоване Вивершення| нижче).
COMP_WORDS : Змінна масиву (дивіться ?Масиви| нижче) яка складається із окремих слів на поточній командній лінії. Ця змінна доступна тільки у функціях оболонки викликаних програмованими засобами вивершення (дивіться ?Програмоване Вивершення| нижче).
DIRSTACK : Змінна масиву (дивіться ?Масиви| нижче) що втримує поточний вміст стеку директорій. Директорії розміщені у стеку у тій самій послідовності в якій вони з'являються при виконанні dirs вбудованої функції. Надання нового значення окремим елементам цього масиву може використовуватись для того щоб змінювати директорії що вже знаходяться у стеку, але лише за допомогою pushd та popd ,вбудованих функцій, можна додавати та вилучати зі стеку. Пряме присвоєння DIRSTACK не змінить поточну директорію. Якщо DIRSTACK скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
EUID : Розширюється до дійсного ID теперішнього користувача, встановленого при старті оболонки. Ця змінна тільки для читання.
FUNCNAME : Назва поточної діючої функції. Ця змінна існує тільки якщо якась функція оболонки запущена. Надання нового значення FUNCNAME не матиме ніякого ефекту і видасть повідомлення про помилку. Якщо FUNCNАМE скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
GROUPS : Змінна масиву що утримує список груп в яких числиться теперішній користувач. Надання нових значень GROUPS не діятиме і видасть повідомлення про помилку. Якщо GROUPS скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
HISTCMD : Номер з історії, або індекс у списку історії поточної команди. Якщо HISTCMD скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
HOSTNAME : Автоматично набуває значення назви теперішнього хоста.
HOSTTYPE : Автоматично набуває значення рядка що являється унікальним описом типу машини на якому bash виконується в даний момент. Значення по замовчуванню є залежним від системи.
LINEO : Кожний раз як свертаються до цієї змінної, оболонка замінює її значення на десяткове число, що відповідає номеру поточної лінії (починаючи з 1) всередині скрипта або функції. По-за межами скрипта або функції, значення цієї змінної не гарантовано що матиме сенс. Якщо LINEO скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
MACHTYPE : Автоматично набуває значення рядка що описує тип системи на якій виконується bash у стандартному GNU процесор-компанія-система форматі. Зачення по замовчуванню є залежним від системи.
OLDPWD : Попередня робоча директорія що встановлюється cd командою.
OPTARG : Значення останнього аргументу для обробки getopts вбудованою командою (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче).
OPTIND : Індекс наступного аргументу що буде оброблено getopts вбудованою командою (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче).
OSTYPE : Автоматично набуває значення рядка що описує операційну систему на якій виконується bash. По замовчуванню є залежним від системи.
PIPESTATUS : Змінна масиву (дивіться ?Масиви| нижче) що утримує список кодів статусу закінчення процесів найостанніших виконаних конвеєрів із пріоритетною дією (які можуть вміщати лише одну команду).
PPID : ID батьківського процесу оболонки. Ця змінна тільки для читання.
PWD : Поточна робоча директорія, встановлена cd командою.
RANDOM : Кожний раз як звертаються до цієї змінної, генерується випадкове число між 0 та 32767. Ряд випадкових чисел можна видобути шляхом надання значення RANDOM. Якщо RANDOM скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
REPLY : Набуває значення лінії вводу що читається read вбудованою командою, якщо read вживається без аргументів.
SECONDS : Кожний раз як звертаються до цієї змінної, повертається число секунд з моменту виклику оболонки. Якщо якесь значення присвоюється SECONDS тоді значення повернене наступними звертаннями до неї буде час з моменту присвоєння плюс значення що було присвоєне. Якщо SECONDS скасовано (unset), вона втрачає свої спеціальні властивості, навіть якщо пізніше перезаладувати її.
SHELLOPTS : Список розділених комою опцій оболонки. Кожне слово у списку є чинним аргументом для -o опції set вбудованої команди (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче). Опції що з'являються у SHELLOPTS є тими самими що й ті які показані як on при set -o команді. Якщо ця змінна присутня у середовищі коли bash стартує, кожна опція зі списку буде увімкнена перед тим як читати будь-які стартові файли. Ця змінна тільки для читання.
SHLVL : Збільшується на один кожний раз як нова копія bash започаткована.
UID
: Розширюється до користувацького ID поточного користувача. Започатковується при старті оболонки. Ця змінна тільки для читання.
Наступні змінні використовуються оболонкою. В окремих випадках bash надає значення по замовчуванню змінним, ці випадки відмічені нижче.
BASH_ENV : Якщо цей параметр встановлено під час коли bash виконує шел скрипт, значення змінної інтерпретується як назва файлу що містить команди для ініціалізації оболонки, як, наприклад, ~/.bashrc. Значення змінної BASH_ENV піддається розширенню параметра, заміні команди і арифметичному розширенню до того як воно інтерпретується як назва файлу. Змінна PАTH не використовується для того щоб знайти назву файлу.
CDPATH : Пошуковий шлях cd команди. Являється списком, з розділеними двокрапкою директоріями в яких оболонка шукає піддиректорії, вказані cd командою. Зразок значення як ця змінна може втримувати: ``.:~:/usr.
COLUMNS : Використовується select вбудованою командою щоб з'ясувати ширину терміналу для видруковування списків вибору. Автоматично встановлюється після отримання SIGWINCH.
COMPREPLY : Змінна масиву з якої bash вичитує можливі вивершення, згенеровані функцією оболонки, визваної засобами програмованого вивершення (дивіться ?Програмоване Вивершення| нижче).
FCEDIT : Редактор по замовчуванню для fc вбудованої команди.
FIGNORE : Розділений двокрапкою список суфіксів які будуть ігноруватись під час розширення назви файлів (дивіться ?READLINE| нижче). Файл чий суфікс збігається із одним із вказаних у списку буде виключено зі списку назв файлів що півпадають під шаблон. Зразок значення: ``.o:~
GLOBIGNORE : Розділений двокрапкою список зразків що визначають набір назв файлів які будуть ігноруватись при розширенню шляхів. Якщо назва файлу що співпадає із зразком розширення шляху також співпадає із одним із зразків у GLOBIGNORE, тоді ця назва вилучається зі списку співпадань.
HISTCONTROL : Якщо набуває значення ignorespace, тоді лінії що починаються з пробілів не вносяться у список історії. Якщо набуває значення ignoredups, лінії що співпадають з попередніми не добавляються Значення ignoreboth комбінує обидві опції. Якщо змінну скасовано (unset) або вона набуває значення відмінного від перечислeних, тоді всі лінії, прочитані синтаксичним аналізатором, зберігаються у списку історії. Дія цієї змінної витісняється змінною HISTIGNORE. Друга і послідуючі лінії складної команди що простяглась на декілька ліній не перевіряються і додаються до історії, незалежно від значення HISTCONTROL.
HISTFILE : Назва файлу у якій історія команд буде збережена (дивіться ?ІСТОРІЯ| нижче). Значенням по замовчуванню є ~/.bash_history. Якщо скасована (unset), командна історія не зберігається при інтерактивній оболонці.
HISTFILESIZE : Максимальне число ліній у файлі історії. Надаючи цій змінній значення можна добитись того що файл історії буде скорочено, при необхідності, щоб у ньому поміщалось не більше ніж вказана кількість ліній. Значенням по замовчуванню є 500. Файл історії також скорочується до цього числа після запису у нім під час завершення роботи інтерактивної оболонки.
HISTIGNORE
: Розділений двокрапкою список зразків що використовується для того щоб відсіювати лінії що будуть збережені у списку історії. Кожний зразок прикріплений до початку лінії і повинен співпадати із цілою лінією (не можна використовувати лише *'). Кожний зразок порівнюється з лінією після того як перевірки вказані у **HISTCONTROL** мали місце. На додаток до звичайних знаків шаблону, характерних для оболонки,
& ' співпадає із попередньою лінією історії. `& ' може бути екранований з допомогою оберненого слешу; обернений слеш буде видалено перед спробою співпадання. Друга і послідуючі лінії у випадку складної команди що простяглась на декілька ліній не перевіряються і додаються до історії не залежно від значення HISTIGNORE.
HISTSIZE : Кількість команд для запам'ятовування у історії команд (дивіться ?ІСТОРІЯ| нижче). Значення по замовчуванню є 500.
HOME : Домашня директорія поточного користувача; аргумент по замовчуванню для cd вбудованої команди. Значення цієї змінної також використовується при розширенні тильди.
HOSTFILE : Містить назву файла в тому самому форматі що й /etc/hosts, файл буде прочитано в випадку коли оболонка повинна виповнити назву хоста. Список можливих виповнень назв хоста може бути змінений під час роботи оболонки. При наступній спробі виповнення назв хостів після того як значення змінної змінилось, bash додає вміст нового файла до існуючого списку (хостів). Якщо HOSTFILE започатковано, але вона на містить ніякого значення, bash пробує читати /etc/hosts для того щоб отримати список можливих виповнень назв хостів. Коли HOSTFILE скасовано, список назв хостів очищується.
IFS : Внутрішній розділювач полів (Internal Field Separator) що використовується для розділення слів після розширення а також для розділення ліній в окремі слова, після використання read вбудованої команди. Значенням по замовчуванню є ``<пробіл><табуляція><нова лінія>''.
IGNOREEOF : Контролює реакцію інтерактивної оболонки на отримання винятково EOF знаків при вводі. Якщо започаткована, повинна утримувати число що вказуватиме кількість EOF що повинно бути введено як перший знак вводу до того як bash завершить свою роботу. Якщо змінна існує, але не має значення у вигляді цифри, або значення взагалі, то по замовчуванню значенням буде 10. Якщо змінну не започатковано, тоді один EOF буде означати припинення вводу для оболонки.
INPUTRC : Назва стартового файла для readline що замінить дефолтовий ~/.inputrc (дивіться ?READLINE| нижче).
LANG : Визначає значення локалі для любої категорії що не була прямо вказана змінними що починаються з LC_.
LC_ALL : Ця змінна пересилює значення LANG або любої іншої LC_ змінної що вказує категорію локалі.
LC_COLLATE : Визначає порядок сортування результатів розширення назв шляхів, також поводження виразів діапазону, класів еквівалентності і співпадаючі послідовності всередині розширення назв шляхів та співпадання із шаблонами.
LC_TYPE : Ця змінна визначає інтерпретацію знаків і поводження класів знаків всередині розширення назв шляхів і співпадання із шаблонами.
LC_MESSAGES : Ця змінна визначає локаль що буде використано для перекладу рядків взятих у подвійні лапки і з передуючим $.
LC_NUMERIC : Ця змінна визначає категорію локалі для форматування чисел.
LINES : Використовується select вбудованою командою для того щоб визначити довжину стовпчиків для видруку списків селекції. Автоматично встановлюється після отримання SIGWINCH.
MAIL : Якщо цей параметр встановлено як назва файла і змінну MAILPATH не започатковано, bash буде повідомлювати користувача про нову пошту у вказаному файлі.
MAILCHECK : Вказує як часто (в секундах) bash перевіряє пошту. По замовчуванню це 60 секунд. Коли час перевірити пошту, bash зробить це перед тим як відобразити запрошення. Якщо цю змінну скасовано (unset), або надано значення у вигляді числа яке не являється більшим або рівним нулю, шел унеможливить перевірку пошти.
MAILPATH
: Розділений двокрапкою список назв файлів що будуть перевірятись на наявність пошти. Повідомлення, що буде видрукувано з появою нової пошти у певному файлі, може бути вказане шляхом відділення назви файлу від повідомлення `?' знаком. Коли змінну $_ застосовано всередині тексту повідомлення, вона розширюється до назви поточного файлу пошти. Наприклад:
: MAILPATH='/var/mail/bfox?"You have mail":~/Mail/read?"$_ has mail!"'
: Bash надає значення по замовчуванню цій змінній, але розташування поштових файлів користувача яке bash використовує є залежним від системи (наприклад, /var/mail/$USER).
OPTERR : Якщо надано значення 1, bash буде відображати повідомлення про помилки, що генеруються getopts вбудованою командою (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). OPTERR ініціалізується із значенням 1 кожний раз як викликається оболонка або запускається скрипт.
PATH
: Шлях пошуку команд. Є розділеним двокрапкою списком директорій в яких оболонка шукає команди (дивіться ?ВИКОНАННЯ КОМАНД| нижче). Шлях по замовчуванню є залежним від системи і встановлюється адміністратором який інсталював bash. Поширеним значенням є
``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''.
POSIXLY_CORRECT : Якщо ця змінна присутня в середовищі під час запуску bash, оболонка набуває posix стану (posix mode) до того як прочитати стартові файли, так ніби була надана --posix опція під час виклику. Якщо змінна встановлена під час роботи оболонки, bash уможливлює posix стан, так ніби set -o posix було виконано.
PROMPT_COMMAND : Якщо встановлена, значення змінної буде виконано як команда перед появою кожного головної підказки (prompt).
PS1 : Значення цього параметра розширюється і використовується як рядок головної підказки. Значенням по замовчуванню є ``\s-\v\$ ''.
PS2 : Значення цього параметра розширюється так само як і PS1 і використовується для другорядної підказки. По замовчуванню ``>''.
PS3 : Значення цього параметра використовується як підказка для select команди (дивіться ?ГРАМАТИКА ОБОЛОНКИ| вище).
PS4 : Значення цього параметру розширюється так само як і PS1, результат видруковується перед кожнoю командою що bash виводить під час трасування виконання. Перший знак PS4 може повторюватись багато разів, якщо необхідно, для того щоб вказати кількість проміжних рівнів. По замовчуванню є ``+''.
TIMEFORMAT : Значення цього параметру використовується як рядок форматування що вказує як інформація часу для конвеєрів із time префіксом буде відображена. Знак % відіграє роль керівної послідовності що розширюється до значення часу або другої інформації. Керівні послідовності і їхні значення (квадратні дужки означають необов'язкові частини):
: %% Буквальний знак %.
: %[p][l]R Час що минув у секундах.
: %[p][l]U Число секунд ЦП, проведених у користувацькому режимі.
: %[p][l]S Число секунд ЦП, проведених у системному режимі.
: %P Процент ЦП, обчислений дією (%U + %S) / %R.
: Необов'язковий p є числом що вказує на точність, тобто кількість десяткових чисел після крапки. Значення 0 спричиняє до того що жодного десяткового числа не буде відображено. Максимум три числа після крапки може бути вказано, якщо значення p є більшим за 3, то воно змінюється на 3. Якщо p не вказане, вживається 3.
: Необов'язковий l вказує на довший формат, включаючи хвилини, у формі MM_m_SS.FF_s. Значення p визначає будуть десяткові числа (FF_) включені чи ні.
: Якщо ця змінна не започаткована, bash удає ніби вона має значення $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS' . Якщо значення є нульовим, ніякої інформації часу не відображається. Кінцева нова лінія додається автоматично при виведені форматованого рядка.
TMOUT : Якщо надано значення більше за нуль, це значення інтерпретується як кількість секунд очікуваних оболонкою для користувацького вводу після виведеня головної підказки. Bash закінчить свою дію, почекавши це число секунд, якщо не надійшло ніякого вводу.
auto_resume : Ця змінна контролює як оболонка взаємодіє з користувачем і керуванням завдань. Якщо ця змінна встановлена, прості команди що складаються з одного слова, без перенаправлень, розглядаються як можливі ключі для відновлення поточних зупинених завдань. Не дозволяється ніяка двозначність, якщо існує більше ніж одне завдання, що починається з того самого надрукованого рядка, найостанніше завдання, до якого мали доступ, буде вибрано. Назва зупиненого завдання в цьому контексті є командною лінією що буде використана для відновлення завдання. Якщо змінна отримує значення exact, введений рядок повинен повністю співпадати із зупиненим завданням, якщо значенням є substring, введений рядок може співпадати лише із частиною рядка зупиненого завдання. Значення substring надає функціональність аналогічну до %? ідентифікатора завдання (дивіться ?КОНТРОЛЬ ВИКОНАННЯ РОБІТ| нижче). Якщо отримує якесь інше значення, то це значення повинно бути префіксом до рядка зупиненого завдання; це забезпечує функціональність аналогічну до % ідентифікатора завдання.
histchars
: Два або три знака що контролюватимуть розкриття історії та лексеми (дивіться ?РОЗКРИТТЯ ІСТОРІЇ| нижче). Перший знак є знаком розширення історії, знак що дасть сигнал початку розширенню історії, звичайно **!** '. Другий знак буде знаком _швидкої заміни_, який служить скороченням заміни попередньо введеної команди новою. По замовчуванню є
^ '. Третій, необов'язковий, знак вказує на те що все що за ним слідує є коментарем при розширені історії, звичайно ` # '. Знак коментування історії спричиняє до того що заміну історії буде уникнено для решти слів на лінії. Він не обов'язково означає що аналізатор оболонки буде сприймати решту лінії як коментар.
Масиви
Bash надає змінні одновимірного масиву. Люба змінна може бути використана як масив; вбудована функція declare відкрито декларує масив. Максимальний розмір масиву не є встановленим, так само як і необов'язковість того щоб окремі елементи масиву були індексованими або їм надавалось значення по порядку. Масиви індексуються за допомогою цілих чисел і індексація починається з нуля.
Масив створюється автоматично якщо змінній надається значення, використовуючи синтаксис назва[індекс]=значення. Індекс розглядається як арифметичний вираз що повинен бути оцінений як число більше або рівне нулю. Щоб відкрито декларувати масив, використовуйте declare -a назва (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче). declare -а назва[індекс] також дозволене, індекс частина просто ігнорується. Можна вказати атрибути масиву з допомогою declare та readonly вбудованих функцій. Атрибути дійсні для всіх членів масиву.
Масивам надається значення з допомогою складених присвоєнь що мають форму назва=(значення1 ... значенняn), тоді як кожне значення має форму [індекс]=рядок. Тільки рядок є обов'язковим. Якщо, факультативні, квадратні дужки та індекс вказані, тоді саме елементу з цим індексом надається значення, в протилежному випадку індексом елемента над яким відбувається дія присвоєння стане останній індекс останнього елемента якому присвоїли значення плюс один. Індексація починається з нуля. Цей синтаксис також визнається вбудованою declare. Індивідуальним елементам масиву може надаватись начення використовуючи, вище згаданий, назва[індекс]=значення синтаксис.
До любого елементу в масиві можна звернутися, користуючись ${назва[індекс]}. Використання фігурних дужок бажане щоб уникнути конфліктів із розширенням шляхів. Якщо індексом буде @ або , то вираз розшириться у всі елементи масиву. Поводження індексів відмінне коли вираз включено у подвійні лапки. Якщо вираз включено в подвійні лапки, ${назва[]} розширюється до одного слова із значенням кожного елемента масиву розділених першим знаком IFS спеціальної змінної, і ${назва[@]} розширює кожний елемент масиву у окреме слово. При відстності елементів у масиві, ${назва[@]} розширюється до нічого. Це аналогічно розширенню спеціальних параметрів та @ (дивіться ?Спеціальні Параметри| вище). ${#назва[індекс]} розширюється до довжини ${назва[індекс]}. Якщо індекс або @, результатом розширення буде кількість елементів у масиві. Звертання до змінної масиву, не вказуючи індексу, рівносильне звертанню до змінної з індексом нуль.
Вбудована функція unset використовується для того щоб знищити масив. unset назва[індекс] знищить лише елемент з даним індексом. unset назва, де назва буде масивом, або unset назва[індекс], де індексом буде * або @ знищить цілий масив.
Вбудовані функції declare, local та readonly можуть вживатися з -a опцією для того щоб вказати масив. Вбудована read також можна вживати з -a опцією щоб привласнити список слів, прочитаний із стандартного вводу, масиву. Вбудовані set та declare виводять значення масиву таким чином що вони можуть бути використані у присвоєнні.
РОЗКРИТТЯ
Розкриття (expansion) відбувається після того, як командний рядок розділиться на окремі слова. Існує сім видів розкриття: розкриття фігурних дужок, розкриття тильди, розкриття параметрів та змінних, заміна команд, арифметичне розкриття, розділення слів та розкриття шляхів.
Порядок розкриття наступний: розкриття фігурних дужок, розкриття тильди, розкриття параметрів та змінних, арифметичні розкриття, заміна команд (відбувається зліва направо), розділення слів та розкриття шляхів.
На системах, які це підтримують, існує додаткове розкриття: заміна процесу.
Тільки розкриття фігурних дужок, розділення слів та розкриття шляхів можуть міняти кількість слів у виразі. Під час решти розкриттів кількість слів не міняється. Єдиний виняток становлять розкриття "$@" та "${назва[@]}", як вже було пояснено вище (дивіться ?ПАРАМЕТРИ|).
Розкриття фігурних дужок
Розкриття фігурних дужок є механізмом завдяки якому можна генерувати довільні рядки. Цей механізм дещо подібний до розкриття шляхів, але назви файлів, які згенеруються, не обов'язково повинні існувати. Шаблони, для того щоб бути розширеними у фігурних дужках, повинні бути у формі, не обов'язкової, преамбули, за якою слідує декілька, розділених комою, рядків, включених у, власне, фігурні дужки, за якими може бути, не обов'язкове, закінчення. Преамбула стає префіксом усіх рядків, взятих у фігурні дужки, тоді як рядок-закінчення додається в кінці кожного новоутвореного рядка. Розкриття відбуватиметься зліва направо.
Фігурні дужки можуть гніздитись. Результат розкриття не сортується, а його порядок зберігається — зліва направо. Так, наприклад, a{d,c,b}f розкривається в `abf ace abe'.
Розкриття фігурних дужок відбувається перед усіма іншими розкриттями й будь-які особливі знаки, важливі для інших розкриттів, будуть збережені у його результаті. Тобто — воно винятково текстуальне. Bash не використовує жодних синтаксичних інтерпретацій стосовно контексту розкриття або тексту всередині фігурних дужок.
Правильно сформований вираз повинен включати незалапковану відкриваючу та закриваючу фігурнi дужки і, щонайменше, одну незалапковану кому. Якщо вираз сформувати неправильно, фігурні дужки розкриватись не будуть. Буквальні {, } або , можна екранувати зворотною похилою рискою, щоб уникнути інтерпретації їх як частини синтаксису виразу. Щоб запобігти конфліктів з розкриттям параметрів, рядок ${ не підляга розширенню фігурних дужок.
Конструкція із фігурними дужками як правило використовується для скорочення, коли префікси навіть довші, ніж в наступних прикладах:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
або
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Розкриття фігурних дужок додає деяку несумісність з історичними версіями sh. Оболонка sh не розглядає відкривну та закривну дужки як спеціальні і зберігає їх у виводі. Bash же вилучає дужки при вдалому розкритті. Так, введений у sh вираз file{1,2} буде виведено буквально, тоді як у bash це видасть file1 та file2. Якщо необхідна цілковита сумісність bash із sh, то розпочинайте bash із +B опцією, або скасуйте розширення фігурних дужок давши +B опцію set команді (дивіться ?ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ| нижче).
Розкриття тильди
Якщо слово починається з неекранованої тильди (`~'), всі знаки до першого не неекранованого слешу (або всі знаки, якщо немає неекранованого слешу) розглядаються як тильда-префікс. Якщо жоден з знаків із тильди-префіксу не є включеним у лапки, знаки що слідують за тильдою розглядатимуться як можливе ім'я користувача. Якщо це ім'я користувача являється пустим рядком, тильда замінюється значенням параметру HOME. Якщо HOME скасовано (unset), домашній каталог користувача, що запустив оболонку, буде використано натомість. В інших випадках, тильда-префікс замінюється назвою домашнього каталогу асоційованого з вказаним ім'ям користувача.
Якщо тильда-префіком є **~+**', значення змінної оболонки **PWD** замінює тильду-префікс. Якщо тильда-префіксом є
~-', значення змінної оболонки OLDPWD, якщо вона започаткована, замінить префікс. Якщо знаки, що слідують за тильдою, складаються із числа N із необов'язковими **+**' або
-' спереду, тильда-префікс замінюється відповідною директорією зі стеку директорій, які можна побачити за допомогою dirs вбудованої команди із тильдою-префіксом як аргумент. Якщо перед номером що слідує за тильдою-префіксом не стоїть **+**' або
-', то `+' використовується по замовчуванню.
Якщо назва користувача не є дійсною, то розкриття тильди зазнає невдачі і слово залишиться без змін.
Кожне присвоєння значення змінній автоматично також перевіряється на наявність неекранованого тильда-префікса що може слідувати : або =. Якщо знайдений, тоді спочатку відбудеться розширення тильди. Таким чином, можна використовувати тильди при наданні значення PATH, MAILPATH та CDPATH.
Розкриття параметрів
Знак `$' надає додаткову можливість розкриття параметрів, заміни команд і арифметичних розвернень. Назва параметра або знаки над якими відбудеться розвернення можуть бути включеними у фігурні дужки, які не являються обов'язковими але захищать змінні від довільних знаків що можуть слідувати за ними, щоб таким чином уникнути зливання назви змінних з сусідніми знаками.
Якщо використовуються фігурні дужки, то закриваючою `}' буде перша ж неекранована оберненим слешом або лапками, а не ті шо можуть зустрітися всередині арифметичних виразів, замін команд або розкриття параметрів.
${параметр}
: Дужки обов'язкові якщо параметр є позиційним параметром із більше ніж однією цифрою або коли за параметр одразу слідує знак який не є часткою його назви.
Якщо першим знаком параметра буде знак оклику, це призведе до одного рівня непрямого звернення до змінної.
Bash використовує значення змінної, сформованої з решти параметра як назву змінної. Ця змінна потім розвернена і це значення використовується у решті заміни, замість, власне, значення параметра. Це відомо як непряме розвернення. Винятком до цього буде розвернення ${!префікс*}, яке описане нижче.
У кожному із прикладів нижче, слово піддається розширенню тильди, розширенню параметрів, заміні команди і арифметичному розширенню. Якщо не здійснюється розширення підрядка, bash перевіряє параметр чи його не було скасований (unset) або він не є null, пропуск двокрапки призводить до перевірки тільки на параметр що скасовано (unset).
${параметр :- слово}
: Використати значення по замовчуванню. Якщо параметр скасовано (unset) або нульовий, розширення слова стане на його місце, значення параметра залишаючись незмінним. Якщо ні, то параметр буде використано.
${параметр := слово}
: Присвоїти значення по замовчуванню. Якщо параметр скасовано (unset) або нуль, розширення слова присвоюється параметру. Позиційним параметрам та спеціальним параметрам не можна присвоювати значення таким чином.
${параметр :? слово}
: Спричинити помилку якщо нуль або скасовано'. Якщо параметр є нуль або скасовано, розширення слова (або стандартне повідомлення оболонки про помилку якщо слово відсутне) буде виведено на екран як стандартна помилка, в випадку не інтерактивності, оболонка припине роботу. В іншому випадку, значення параметра заміняється.
${параметр :+ слово}
: Використати протилежне значення. Якщо параметр нульовий або скасовано (unset) нічого не замінюється, якщо ні - розширення слова бере місце параметра.
${параметр : відступ}
${параметр : відступ : довжина}
: Розширення підрядка. Розширюється до довжини знаків параметра, починаючи зі знака вказаного у відступі. Якщо довжину пропушено, розширюється до частини рядка що міститься у параметрі, починаючи з відступу. Довжина та відступ являються арифметичними виразами (дивіться ?ОБЧИСЛЕННЯ АРИФМЕТИЧНИХ ВИРАЗІВ| нижче). Довжина повиннa мати значення числа більшого або рівного нулю. Якщо довжина виявиться числом меншим за нуль, то значення використовується для відліку від кінця рядка з параметра. Якщо параметр є @, результатом стане довжина позиційних параметрів починаючи з відступу. Якщо параметр є масивом, індексованим @ або *****, результатом буде довжина елементів масиву, починаючи з ${параметр[відступ]}. Індексація масивів починається з нуля за виключенням масивів позиційних параметрів, в цьому випадку індексація починається з 1.
${!префікс*****}
: Розширюється до назв змінних що починаються з пефікса, розділених пешим знаком IFS спеціальної змінної.
${#параметр}
: Замінюється на кількість знаків у значенні параметра. Якщо параметр є або @, то на кількість позиційних параметрів. Якщо параметр є назвою масиву із індексом або @, заміниться на кількість елементів у масиві.
${параметр#слово}
${параметр##слово}
: Слово є шаблоном. Якщо шаблон співпадає з початком значення параметра, тоді найкоротша частина що співпала буде вилучена у **#**'' випадку, або найдовша частина що співпадає буде вилучена у
##'' випадку. Ящо параметром є @ або , вилучення за шаблоном відбуватиметься по відношенню до кожного позиційного параметра по черзі. Якщо параметр це змінна масиву із індексом @ або , вилучення за шаблоном буде проведено по відношенню до кожного окремого елементу масиву по черзі.
${параметр%слово}
${параметр%%слово}
: Слово є шаблоном. Якщо шаблон співпадає з кінцем значення параметра, тоді найкоротша частина що співпала буде вилучена у **%**'' випадку, або найдовша частина що співпадає буде вилучена у
%%'' випадку. Якщо параметр є @ або , вилучення за шаблоном буде проводитись по відношенню до кожного позиційного параметра по черзі. Якщо параметр це змінна масиву із індексом @ або , тоді вилучення за шаблоном відбудеться по відношенню до кожного окремого елементу масиву по черзі.
${параметр/слово/рядок}
${параметр//слово/рядок}
: Слово є шаблоном на зразок шаблонів для розширення шляхів. Частина значення параметра що співпала з шаблоном заміниться на рядок. У першому випадку лише перше співпадання заміниться, у другому ж всі співпадання. Якщо слово починається з #, співпадання очікується лише на самому початку значення параметра, і навпаки, % означає що співпадання очікується наприкінці. Якщо рядок не вказано, співпадання із словом вилучаються і слеш (/) за словом не обов'язковий. Якщо параметр є @ або , заміна за шаблоном відбувається відносно кожного позиційного параметра по черзі. Якщо параметр є змінною масиву з індеском @ або , заміна за шаблоном відбудеться відносно кожного елементу масиву по черзі.
Заміна Команди
Заміна команди дозволяє виводу команди замінити назву команди. Існують дві форми:
$(_команда_)
або
`_команда_`
Bash виконує команду і замінює весь вираз на стандартний вивід команди, любі знаки нової лінії наприкінці вилучаються. Знаки нової лінії всередині виводу не вилучаються, але вони можуть бути усиненими під час розділяння слів. Заміна команди $(cat file) може бути написана як швидший еквівалент $(< file).
Коли старого стилю обернені лапки використано, обернений слеш зберігає своє буквальне значення, за винятком коли за ним слідує $, ` або **. Перші ж обернені лапки, які не є екрановані оберненим слешом, завершує вираз заміни команд. Коли використовується $(команда) форма, всі знаки що знаходяться всередині дужок є складовою команди, жоден не розглядається як спеціальний.
Заміни команд можуть бути розміщені гніздами. Щоб гніздити команди у класичній формі обернених лапок, екрануйте обернені лапки всередині виразу оберненим слешом.
Якщо заміна команд відбувається всередині подвійних лапок, розділення слів та розширення шляхів не відбуватиметься по відношенню до результатів заміни.
Арифметичне Розширення
Арифметичне розширення дозволяє обчислення арифметичних виразів і заміни виразу результатом обчислення. Формат арифметичних розширень наступний:
**$((**_вираз_**))**
Вираз розглядається так як би він знаходився всередині подвійних лапок, але подвійні лапки всередині дужок не вважаються спеціальними. Всі лексеми всередині виразу піддаються розширенню параметрів, розширенню рядків, заміні команд і усуненню лапок. Арифметичні розширення можна гніздити.
Обчислення відбувається відповідно правил, перечислених у розділі ?ОБЧИСЛЕННЯ АРИФМЕТИЧНИХ ВИРАЗІВ|. Якщо вираз не є дійсним, bash виведе повідомлення що вказує на невдачу і розширення не відбудеться.
Заміна Процесів
Заміна процесів може використовуватись на системах що підтримують поіменовані конвеєри (FIFO) або /dev/fd метод надання назв відкритим файлам. Заміни процесів мають форму <(список) або >(список). Процеси у списку запускаються з вводом або виводом, прикріпленими до FIFO або якогось файлу у /dev/fd. Назва цього файлу що утворився в результаті розширення заміни процесів, подається як агрумент поточної команди. Якщо використовується >(список) форма, запис до цього файлу забеспечує ввід для списку процесів. Якщо використовується <(список) форма, файл, наданий як аргумент повинен читатися для того щоб отримати вивід списку.
Коли це можливо, заміна процесів відбувається одночасно з розширенням параметрів і змінних, заміною команд і арифметичним розширенням.
ПЕРЕНАПРАВЛЕННЯ
ПСЕВДОНІМИ
ФУНКЦІЇ
ОБЧИСЛЕННЯ АРИФМЕТИЧНИХ ВИРАЗІВ
УМОВНІ ВИРАЗИ
РОЗШИРЕННЯ ПРИ ВИКОНАННІ ПРОСТИХ КОМАНД
ВИКОНАННЯ КОМАНД
СЕРЕДОВИЩЕ ВИКОНАННЯ КОМАНД
СЕРЕДОВИЩЕ
СТАН ВИХОДУ
СИГНАЛИ
КОНТРОЛЬ ВИКОНАННЯ РОБІТ
ВИГЛЯД ПІДКАЗКИ (PROMPT)
READLINE
АРХІВ
РОЗШИРЕННЯ АРХІВУ
ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ
ОБМЕЖЕНА ОБОЛОНКА
ДИВІТЬСЯ ТАКОЖ
Bash Reference Manual, Brian Fox and Chet Ramey
The Gnu Readline Library, Brian Fox and Chet Ramey
The Gnu History Library, Brian Fox and Chet Ramey
Portable Operating System Interface (POSIX) Part 2: Shell and Utilities, IEEE
?sh(1), ?ksh(1), ?csh(1), ?emacs(1), ?vi(1), ?readline(3).
ФАЙЛИ
/bin/bash
: Сама програми оболонки Bash
/etc/profile
: Загальносистемний ініціалізаційний файл, що виконується при вході у систему.
~/.bash_profile
: Персональний ініціалізаційний файл, що виконується при вході у систему.
~/.bashrc
: Персональний ініціалізаційний файл, що виконується після входу в систему.
~/.bash_logout
: Персональний файл, що виконується при виході з системи, для очистки екрану, тощо.
~/.inputrc
: Персональний ініціалізаційний файл для readline.
АВТОРИ
Брайан Фокс (Brian Fox), Free Software Foundation
bfox@gnu.org
Чет Рамі (Chet Ramey), Case Western Reserve University
chet@ins.CWRU.Edu
ПОВІДОМЛЕННЯ ПРО ВАДИ
Якщо ви знайшли ваду в bash, ви повинні сказати про неї. Але спочатку, переконайтесь, що це дійсно вада та те, що вона присутня у останній версії bash, яка у вас є.
Як тільки ви встановили, що ця вада дійсно існує, використайте команду bashbug для подання повідомлення про вади. Якщо у вас є виправлення цієї помилки, відправте його також! Ви можете відправляти пропозиції та "філософські" повідомлення про вади за адресою bug-bash@gnu.org чи поміщати до групи новин Usenet gnu.bash.org
Всі повідомлення про вади повинні включати:
- Номер версії bash
- Дані про апаратне забеспечення та операційну систему
- Компілятор, за допомогою якого було скомпільовано bash
- Опис поведінки вади
- Короткий скрипт чи "рецепт", що дозволяє визначити помилку
bashbug створює шаблон для повідомлення про вади, автоматично заповнюючи перші три пункти.
Коментарі та відгуки, що стосуються цієї сторінки підручника повинні направлятися до chet@ins.CWRU.Edu (оригіналу цього перекладу).
ВАДИ
Bash надто великий та надто повільний.
Є деякі тонкі відмінності між bash та традиційною версією sh, головним чином через специфікацію POSIX.
Використання псевдонімів є заплутаним в деяких випадках.
Вбудовані команди і функції не можна зупиняти/перезапускати.
Складені команди і послідовності команд у формі `a ; b ; c' не обробляються належним чином коли робиться спроба припинення процесу. Коли процес зупиняється, оболонка негайно виконує наступну команду в послідовності. Достатньо помістити послідовність команд у скобки щоб примусити запуск підоболонки, яку можна зупиняти як блок.
Команди всередині підстановки команд $(...) не аналізуються доки не відбудеться спроба підстановки. Це затримує звіт про помилку на деякий час після виконання підстановки команд.
Змінні-масиви не можна (поки що) експортувати.
?повернутися до сторінок підручника