BASH(1) General Commands Manual BASH(1)

НАЗВА

bash — GNU Bourne-Again SHell

КОРОТКИЙ ОПИС

bash [параметри] [рядок_команди | файл]

АВТОРСЬКІ ПРАВА

Bash is Copyright (C) 1989-2020 by the Free Software Foundation, Inc.

ОПИС

Bash є сумісним із sh інтерпретатором мови командного рядка, який виконує команди, прочитані зі стандартного джерела вхідних даних або з файла. У Bash також реалізовано корисні можливості оболонок Korn і C (ksh і csh).

Bash створено як сумісну реалізацію розділів щодо оболонки та допоміжних програм специфікації IEEE POSIX (стандарту IEEE 1003.1). Bash можна типово налаштувати на сумісність із POSIX.

ПАРАМЕТРИ

Усіма односимвольними параметрами оболонки, які документовано в описі вбудованої команди set, зокрема -o, можна скористатися як параметрами під час виклику оболонки. Крім того, під час виклику bash виконує обробку таких параметрів:

Якщо вказано параметр -c, команди буде прочитано з першого аргументу, який не є параметром, рядок_команди. Якщо після аргументу рядок_команди вказано інші аргументи, перший аргумент буде пов'язано із $0, а усі інші аргументи — з наступними позиційними параметрами. Прив'язка до $0 встановлює назву оболонки, яку буде використано у повідомленнях із попередженнями та повідомленнях про помилки.
Якщо вказано параметр -i, оболонка є інтерактивною.
Наказує bash працювати так, наче програму викликано як оболонку для входу до системи (див. ВИКЛИК нижче).
Якщо вказано параметр -r, оболонка стає обмеженою (див. ОБМЕЖЕНА ОБОЛОНКА нижче).
Якщо вказано параметр -s або якщо після обробки параметрів не буде виявлено аргументів, команди буде прочитано зі стандартного джерела вхідних даних. За допомогою цього параметра можна встановлювати позиційні параметри при виклику інтерактивної оболонки або при читанні вхідних даних за допомогою конвеєра команд.
Список усіх рядків у подвійних лапках, яким передуватиме $, буде виведено до стандартного виведення. Це рядки, які підлягатимуть перекладу, якщо поточною локаллю не є C або POSIX. Неявним чином буде також застосовано параметр -n. Команди оболонки не виконуватимуться.
[-+]O [параметр_оболонки]
параметр_оболонки є одним з параметрів оболонки, який приймає вбудований засіб shopt (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Якщо вказано параметр_оболонки, -O встановлює значення цього параметра; +O скасовує встановлення. Якщо параметр_оболонки не вказано, до стандартного виведення буде виведено назви і значення параметрів оболонки, які приймаються shopt. Якщо параметром виклику є +O, виведення буде показано у форматі, який може бути повторно використано як вхідні дані програми.
--
-- вказує на завершення параметрів і вимикає подальшу обробку параметрів. Будь-які аргументи після -- оброблятимуться як назви файлів та аргументи. Аргумент - є еквівалентним до --.

Крім того, bash обробляє декілька багатосимвольних параметрів. Ці параметри має бути вказано у командному рядку до односимвольних параметрів, щоб їх було розпізнано.

Налаштовування для профілю засобу діагностики, який слід виконати до запуску оболонки. Вмикає розширений режим діагностики (див. опис параметра extdebug вбудованого засобу shopt нижче).
Еквівалент -D, але виведення відбуватиметься у форматі файлів GNU gettext po (портативного об'єкта).
Те саме, що і -D.
Вивести повідомлення щодо користування до стандартного виведення і завершити роботу програми зі станом «успіх».
Виконати команди з файла файл замість стандартного особистого файла ініціалізації ~/.bashrc, якщо оболонка є інтерактивною (див. ВИКЛИК нижче).
Еквівалент -l.
Не використовувати бібліотеку GNU readline для читання рядків команд, якщо оболонка є інтерактивною.
Не читати або загальносистемний файл запуску /etc/profile або будь-які особисті файли ініціалізації ~/.bash_profile, ~/.bash_login або ~/.profile. Типово, bash читає ці файли при виклику у режимі оболонки входу до системи (див. ВИКЛИК нижче).
Не читати і не виконувати особистий файл ініціалізації ~/.bashrc, якщо оболонка є інтерактивною. Типово, цей параметр буде використано, якщо оболонку викликано за допомогою команди sh.
Змінити поведінку bash там, де типові дії відрізняються від стандарту POSIX так, щоб відповідати стандарту (режим posix). Див. розділ ТАКОЖ ПЕРЕГЛЯНЬТЕ, де наведено посилання на документ із подробицями щодо того, як режим posix впливає на поведінку bash.
Оболонка стає обмеженою (див. ОБМЕЖЕНА ОБОЛОНКА нижче).
Еквівалент -v.
Вивести дані щодо версії цього екземпляра bash до стандартного виведення і завершити роботу зі станом виходу «успіх».

АРГУМЕНТИ

Якщо після обробки параметрів у рядку команди лишаться аргументи, і не вказано ні параметр -c, ні параметр -s, перший аргумент буде оброблено як назву файла, у якому зберігаються команди оболонки. Якщо bash викликано у такий спосіб, для $0 буде встановлено значення назви цього файла, а решту аргументів буде розподілено між іншими позиційними параметрами послідовно. Bash прочитає і виконає команди із вказаного файла, а потім завершить роботу. Кодом стану виходу bash буде код стану виходу останньої виконаної у скрипті команди. Якщо не буде виконано жодної команди, кодом стану виходу буде 0. Спершу буде виконано спробу відкрити файл у поточному каталозі. Якщо файла із вказаною назвою не буде знайдено, оболонка виконає пошук файла скрипту у каталогах змінної середовища PATH.

ВИКЛИК

A login shell є той, чий перший символ нульового аргументу є -, або той, що починається з параметра --login.

Інтерактивною є оболонка, яку запущено без аргументів, які не є аргументами параметрів (якщо не вказано параметр -s), і без параметра -c, чиї стандартні джерело вхідних даних та виведення помилок з'єднано з терміналами (як це визначено isatty(3)), або оболонка, яку запущено з параметром -i. Якщо bash є інтерактивною, встановлюється PS1, а $- включає i, що надає змогу скрипту оболонки або файлу запуску перевіряти відповідний стан.

Нижче наведено опис того, як bash виконує свої файли запуску. Якщо існує якийсь з цих файлів, але його не можна прочитати, bash повідомляє про помилку. Записи з тильдою розгортаються до назв файлів, як це описано нижче у підрозділі Розгортання з тильдою розділу РОЗГОРТАННЯ.

Якщо bash викликано як інтерактивну оболонку для входу до системи або неінтерактивну оболонку із параметром --login, програма спершу читає і виконує команди з файла /etc/profile, якщо такий файл існує. Після читання цього файла, відбувається пошук ~/.bash_profile, ~/.bash_login та ~/.profile, саме у цьому порядку. Програма прочитає і виконає команди з першого з цих файлів, який існує і придатний до читання. Для придушення такої поведінки можна при запуску оболонки скористатися параметром --noprofile.

При виході з інтерактивної оболонки для входу до системи або при виконанні у неінтерактивній оболонці вбудованої команди exit, 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, або фоновою службою безпечної оболонки sshd. Якщо bash визначає, що програму запущено у такий спосіб, програма читає і виконує команди з ~/.bashrc, якщо цей файл існує і є придатним до читання. Програма не робитиме цього, якщо її викликано з використанням назви sh. Щоб успадкувати цю поведінку, можна скористатися параметром --norc, а параметром --rcfile можна скористатися, щоб наказати програмі прочитати інший файл, але ні rshd, ні sshd загалом не викликають оболонку з такими параметрами і не дозволяють вказувати ці параметри.

Якщо оболонку запущено із використанням ідентифікатора ефективного користувача (групи) рівного ідентифікатору справжнього користувача (групи), і не вказано параметр -p, програма не читатиме жодних файлів запуску, функції оболонки не успадковуватимуться з середовища, змінні SHELLOPTS, BASHOPTS, CDPATH та GLOBIGNORE, якщо їх використано у середовищі, буде проігноровано, а для ідентифікатора ефективного користувача буде встановлено значення ідентифікатора справжнього користувача. Якщо при виклику буде використано параметр -p, поведінка при запуску буде тією самою, але значення ідентифікатора ефективного користувача не скидатиметься.

ОЗНАЧЕННЯ

У решті цього документа використано наведені нижче визначення.

пропуск
Пробіл або табуляція.
слово
Послідовність символів, яка обробляється оболонкою як єдиний модуль. Також відома як жетон.
назва
A слово, що містить лише алфавітно-цифрові символи та підкреслення, та починається з букви або підкреслення. Також, на якого посилаються, як identifier.
метасимвол
Символ, який, якщо не брати його у лапки, відокремлює слова. Таким символом може бути:

| & ; ( ) < > space tab newline

оператор керування
Жетон, який виконує контрольну функцію. Один з таких символів:

|| & && ; ;; ;& ;;& ( ) | |& <newline>

ЗАРЕЗЕРВОВАНІ СЛОВА

Зарезервовані слова — слова, які мають особливе значення для оболонки. Вказані нижче слова буде розпізнано як зарезервовані слова, якщо їх не було нейтралізовано, і якщо вони є першим словом команди (див. ГРАМАТИКА ОБОЛОНКИ нижче), третім словом команди case або select (коректним є лише in) або третім словом команди for (коректними є лише in і do):

! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]

ГРАМАТИКА ОБОЛОНКИ

Прості команди

Простою командою є послідовність надання значень змінним, після якої вказано відокремлені пропусками слова і переспрямування і яка завершується оператором керування. Перше слово визначає команду, яку буде виконано, її буде передано як нульовий аргумент. Решту слів буде передано як аргументи команди, яку викликано.

Повернутим значенням простої команди є її код стану виходу або 128+n, якщо команду було перервано із використанням сигналу n.

Конвеєри

Конвеєр є послідовністю однією або декількох команд, які відокремлено одним із керівних операторів | або |&. Формат конвеєра є таким:

[time [-p]] [ ! ] команда [ [||&] команда2 ... ]

Стандартне виведення команди команда з'єднується каналом зі стандартним введенням команди команда2. Це з'єднання виконується до будь-яких переспрямувань, які визначено командою (див. ПЕРЕСПРЯМУВАННЯ нижче). Якщо використано |&, стандартне виведення помилок команди команда, на додачу до її стандартного виведення, з'єднано зі стандартним введенням команди команда2 каналом; це скорочення від 2>&1 |. Це неявне переспрямовування стандартного виведення помилок до стандартного виведення виконується після будь-яких переспрямувань, які визначаються командою.

Кодом стану повернення конвеєра є код стану виходу останньої команди, якщо не вказано параметр pipefail. Якщо увімкнено pipefail, кодом стану повернення конвеєра є значення останньої (найправішої) команди, яка завершила роботу із ненульовим кодом стану, або нуль, якщо усі команди було виконано успішно. Якщо перед конвеєром вказано зарезервоване слово !, кодом стану виходу конвеєра є логічне заперечення коду стану виходу, який описано вище. Оболонка очікує на завершення виконання усіх команд у конвеєрі, перш ніж повернути значення.

Якщо перед конвеєром вказано зарезервоване слово time, після завершення виконання конвеєра буде виведено звіт щодо часу спожитого під час виконання у просторі користувача і у просторі системи. Параметр -p змінює формат виведення на такий, який визначено POSIX. Якщо оболонка працює у режимі posix, вона не розпізнає time як зарезервоване слово, якщо наступний жетон починається з «-». Можна встановити для змінної середовища TIMEFORMAT значення рядка форматування, який визначає спосіб показу даних щодо часу; див. опис TIMEFORMAT у розділі Змінні оболонки нижче.

Якщо оболонка перебуває у режимі posix, після time можна додати символ розриву рядка. У цьому випадку оболонка показуватиме загальний час, який спожито у просторах користувача і системи оболонкою та її дочірніми процесами. Змінною TIMEFORMAT можна скористатися для визначення форматування даних щодо часу.

Кожна команда у конвеєрі виконується як окремий процес (тобто, у підоболонці). Див. СЕРЕДОВИЩЕ ВИКОНАННЯ КОМАНД, щоб ознайомитися із описом середовища підкоманд. Якщо використано параметр lastpipe за допомогою вбудованого запису shopt (див. опис shopt нижче), останній елемент конвеєра може бути виконано процесом оболонки.

Списки

Список є послідовністю одного або декількох конвеєрів команд, які відокремлено одним з операторів ;, &, && або ||, і, якщо потрібно, завершено одним із символів ;, & або <розривом рядка>.

З цих операторів списку && і || мають однакову пріоритетність. Нижчу за них пріоритетність мають ; і &, які теж мають однакову пріоритетність.

У списку може бути використано послідовність з одного або декількох символів нового рядка замість крапки з комою для відокремлення команд.

Якщо команда завершується оператором керування &, оболонка виконує команду у фоновому режимі у підоболонці. Оболонка не чекатиме на завершення виконання такої команди, кодом стану повернення завжди буде 0. Такі команди будемо називати асинхронними. Команди, які відокремлено символом ;, буде виконано послідовно. Оболонка очікуватиме на виконання кожної команди, перш ніж перейти до наступної. Кодом стану повернення буде код стану повернення останньої виконаної команди.

Списки І та АБО є послідовностями одного або більше каналів розділених керуючими операторами && та || відповідно. Списки І та АБО виконуються з лівою асоціативністю. Список І має форму

команда1 && команда2

команду2 буде виконано лише тоді, якщо команда1 повертає нульовий код стану виходу (успіх).

Список OR має форму

команда1 || команда2

Команду команда2 буде виконано тоді і лише тоді, коли команда команда1 повертає ненульовий код стану виходу. Кодом стану повернення списків AND і OR є код стану виходу останньої виконаної команди у списку.

Складені команди


Складена команда є однією з описаних нижче команд. У більшості випадків список в описі команди може відокремлюватися від решти команди одним або кількома новими рядками, а замість крапки з комою може слідувати новий рядок.

(список)
Список виконується в середовищі підоболонки (дивіться СЕРЕДОВИЩЕ ВИКОНАННЯ КОМАНД нижче). Присвоєння змінних і вбудовані команди, які впливають на середовище оболонки, не залишаються в силі після виконання команди. Статус повернення — це стан виходу списку команд список.
{ список; }
список просто виконується в поточному середовищі оболонки. Список повинен завершуватися новим рядком або крапкою з комою. Це називається груповою командою. Стан повернення — це стан виходу списку команд список. Зверніть увагу, що на відміну від метасимволів ( та ), { та } є зарезервованими словами і має відбуватися там, де дозволено розпізнавати зарезервоване слово. Оскільки вони не викликають розриву слова, вони повинні відділятися від списку команд список пробілами або іншими метасимволами оболонки.
((вираз))
вираз обчислюється згідно правил описаних нижче під АРИФМЕТИЧНІ ОБЧИСЛЕННЯ. Якщо значення виразу не нуль, повертається стан 0; в іншому випадку повертається стан 1. Це точний еквівалент let "expression".
[[ вираз ]]
Повертає стан 0 або 1 залежно від оцінки умовного виразу вираз. Вирази складаються з первинних частин, описаних нижче у розділі УМОВНІ ВИРАЗИ. Поділ на слова і розгортання шляхів не виконуються для слів між [[ і ]]; Виконуються розгортання тильди, розширення параметрів і змінних, арифметичне розширення, підстановка команд, підстановка процесу та видалення лапок. Умовні оператори, такі як -f, повинні бути без лапок, щоб бути визнаними основними.

Якщо використано [[, оператори < і > лексикографічно упорядковуватимуться з використанням порядку поточної локалі.

Коли використовуються оператори == і !=, рядок праворуч від оператора вважається взірцем і відповідає правилам, описаним нижче в розділі Відповідність за взірцем, ніби було увімкнено параметр оболонки extglob. Оператор = еквівалентний ==. Якщо увімкнено параметр оболонки nocasematch, пошук збігів виконується без урахування регістру символів алфавіту. Буде повернуто значення 0, якщо рядок відповідає (==) або не відповідає (!=) взірцю, і 1 в іншому випадку. Будь-яку частину взірця можна брати у лапками для встановлення відповідності цій частині, як рядку.

Доступним є додатковий двійковий оператор, =~, із тим самим рівнем пріоритетності, що і as == and !=. Якщо ним скористатися, рядок праворуч від оператора буде оброблено як розширений формальний вираз POSIX і встановлено відповідність (за допомогою інтерфейсів POSIX regcomp і regexec, які зазвичай описано у regex(3)). Буде повернуто значення 0, якщо рядок збігається із взірцем, і 1 в іншому випадку. Якщо формальний вираз є синтаксично помилковим, повернутим значенням умовного виразу буде 2. Якщо увімкнено параметр оболонки nocasematch, відповідність встановлюватиметься без врахування регістру символів абетки. Будь-яку частину взірця можна взяти у лапки, якщо відповідність цієї частини рядка слід встановлювати буквально. З виразами у дужках у формальних виразах слід бути обережними, оскільки звичайні символи нейтралізації втрачають своє значення у дужках. Якщо взірець зберігається у змінній оболонки, нейтралізація розгортання змінної встановлює режим примусового встановлення відповідності за взірцем як звичайним рядком.

Взірець вважатиметься відповідним, якщо він відповідає будь-якій частині рядка. Для того, щоб відповідність було зареєстровано, лише якщо взірець збігається з усім рядком, скористайтеся прив'язками ^ і $. У змінній-масиві BASH_REMATCH зберігається запис частин рядка, які відповідають взірцю. Елемент BASH_REMATCH з індексом 0 частину рядка яка відповідає усьому формальному виразу. Підрядки, які відповідають взятим у дужки підвиразам у формальному виразі, зберігаються у решті індексованих елементів масиву BASH_REMATCH. Елемент BASH_REMATCH із індексом n ж частиною рядка, що відповідає взятому у дужки n-му підвиразу.

Вираз можна поєднувати за допомогою вказаних нижче операторів, які упорядковано за спаданням пріоритетності:

( вираз )
Повертає значення виразу вираз. Цим можна скористатися для перевизначення звичайної пріоритетності операторів.
! вираз
True, якщо вираз має значення false.
вираз1 && вираз2
True, якщо обидва, вираз1 і вираз2, мають значення true.
вираз1 || вираз2
True, якщо вираз1 або вираз2 має значення true.

При використанні операторів && і || значення виразу вираз2 не обчислюватиметься, якщо значення виразу вираз1 достатньо для визначення повернутого значення усього виразу умови.

Список слів, за яким вказано in, розгортається у список записів. Для змінної назва встановлюється значення кожного з елементів списку за чергою, і кожного разу виконується список. Якщо пропущено слово in, команда for виконає список для усіх встановлених позиційних параметрів (див. ПАРАМЕТРИ нижче). Повернутий код стану буде кодом стану виходу останньої виконаної команди. Якщо розгортання записів за in призведе до створення порожнього списку, команди не виконуватимуться, а кодом стану повернення буде 0.
Спочатку, арифметичний вираз вираз1 обчислюється за правилами, описаними нижче у розділі АРИФМЕТИЧНІ ОБЧИСЛЕННЯ. Потім, обчислення арифметичного виразу expr2 повторюється поки не досягне нуля. Кожного разу, коли результатом обчислення виразу вираз2 є нуль, буде виконано список і обчислено арифметичний вираз вираз3. Якщо якогось виразу не буде виявлено, вважатиметься, що його значенням є 1. Повернутим значенням є стан виходу останньої команди список, яка виконалася, або false, якщо будь-який вираз є некоректним.
Список слів після in буде розгорнуто. Результатом буде список записів. Набір розгорнутих слів буде виведено до стандартного виведення помилок, перед кожним з яких буде дописано номер. Якщо буде пропущено слово після in, буде виведено позиційні параметри (див. ПАРАМЕТРИ нижче). Після цього буде показано запит PS3 та рядок, який прочитано зі стандартного виведення. Якщо рядок складається з номера, який відповідає одному зі показаних слів, слову буде надано значення назва. Якщо рядок є порожнім, слова і запит буде показано ще раз. Якщо буде прочитано символ кінця файла (EOF), виконання команди завершується. Будь-яке інше прочитане значення призведе до того, що параметру назва буде надано порожнє значення (null). Прочитаний рядок буде збережено у змінній REPLY. Список команд список буде виконано після кожного вибору варіанта, аж доки не буде виконано команду break. Станом виходу select є стан виходу останньої команди, яку буде виконано у списку список, або нуль, якщо не буде виконаної жодної команди.
Команда case спочатку розгортає слово і намагається послідовно встановити його відповідність кожному із взірців взірець за допомогою правил встановлення відповідності, які описано у розділі Відповідність за взірцем нижче. Слово слово буде розгорнуто із використанням розгортання тильди, розгортання параметрів і змінних, арифметичних обчислень, заміни команд, підставляння процесів та вилучення лапок. Кожен із інспектованих взірців взірець буде розгорнуто із використанням розгортання тильди, розгортання параметрів і змінних, арифметичних обчислень, заміни команд та підставляння процесів. Якщо увімкнено параметр оболонки nocasematch, відповідність встановлюватиметься без врахування регістру символів абетки. Якщо буде встановлено відповідність, буде виконано відповідний список команд список. Якщо буде використано оператор ;;, після першого ж встановлення відповідності взірцю подальші спроби встановлення відповідності не виконуватимуться. Якщо використати ;& замість ;;, виконання продовжуватиметься із прив'язкою списку команд список до наступного набору взірців. Якщо використати ;;& замість ;;, оболонка виконає перевірку наступного списку взірців в інструкції, якщо такий є, і виконає будь-який пов'язаний із нею список команд список, якщо буде встановлено відповідність, продовжуючи виконання інструкцій варіанта так, наче не було встановлено відповідності списку взірців. Станом виходу є нуль, якщо жоден із взірців не є відповідним. Якщо якийсь із взірців виявиться відповідним, станом виходу буде стан виходу останньої виконаної у списку команд список команди.
if список виконується. Якщо стан виходу дорівнює нулю — виконується then список. В іншому випадку по черзі виконується кожен elif список, якщо їхній стан виходу дорівнює нулю, то виконується відповідний then список і команда завершується. Інакше виконується else список, якщо наявний. Станом виходу є стан виходу останньої виконаної команди або нуль, якщо умова не перевірялася.
Команда while послідовно виконує список команд список-2, доки остання команда у списку команд список-1 повертає нульовий стан виходу. Команда until є аналогічною до команди while, але умова у ній є оберненою: список команд список-2 виконуватиметься, доки остання команда у списку команд список-1 не поверне ненульовий стан виходу. Станом виходу команд while і until є стан виходу останньої виконаної команди у списку команд список-2 або нуль, якщо не було виконано жодної команди.

Копроцеси

Копроцес — команда оболонки, перед якою вказано зарезервоване слово coproc. Виконання копроцесу відбувається асинхронно у підоболонці так, наче команду було завершено керівним оператором &. При цьому, буде встановлено двобічний канал обміну даними між оболонкою, у якій виконується копроцес, і копроцесом.

Формат для копроцесу:

coproc [НАЗВА] команда [переспрямування]

Ця команда створює копроцес із назвою НАЗВА. Якщо аргумент НАЗВА не вказано, типовою назвою буде COPROC. Назву НАЗВА не слід вказувати, якщо аргументом команда є проста команда (див. вище). Якщо вказати назву, її буде оброблено як перше слово простої команди. При виконанні копроцесу оболонка створює змінну-масив (див. Масиви нижче) із назвою НАЗВА у контексті оболонки, з якої відбувається виконання. Стандартне виведення команди команда буде з'єднано за допомогою каналу обміну даними із дескриптором файла в оболонці, з якої відбувається виконання, і значення цього дескриптора файла буде надано елементу НАЗВА[0]. Стандартне джерело вхідних даних команди команда буде з'єднано за допомогою каналу із дескриптором файла у оболонці, з якої відбувається виконання, а значення цього дескриптора файла буде надано елементу НАЗВА[1]. Канал обміну даними буде встановлено до виконання будь-яких переспрямувань, які вказано командою (див. ПЕРЕСПРЯМУВАННЯ нижче). Дескрипторами файлів можна скористатися як аргументами команд оболонки з використанням стандартного розгортання слів. Підоболонки не матимуть доступу до дескрипторів файлів, окрім дескрипторів, які створено для виконання команд та підставляння процесів. Доступ до ідентифікатора процесу оболонки, яку викликано для виконання копроцесу, можна отримати як значення змінної НАЗВА_PID. Для очікування на завершення копроцесу можна скористатися вбудованою командою wait.

Оскільки копроцеси створюються як асинхронні команди, команда coproc завжди повертає успіх. Стан вертання копроцесу є станом виходу команди.

Визначення функцій оболонки

Функція оболонки це обʼєкт, що викликається як проста команда і виконує складену команду з новим набором позиційних параметрів. Функція оболонки оголошується наступним чином:

Ця команда визначає функцію із назвою назва_функції. Використання зарезервованого слова function є необов'язковим. Якщо вказано зарезервоване слово function, круглі дужки є необов'язковими. Вмістом функції є складена команда складена_команда (див. Складені команди вище). Ця команда, зазвичай, є списком команд між { і }, але може бути будь-якою командою з наведеного вище списку складених команд із одним виключенням: якщо використано зарезервоване слово function, але круглі дужки не вказано, слід обов'язково використовувати фігурні дужки. Складену команду складена_команда буде викликано кожного разу, коли як назву простої команди використано назва_функції. У режимі posix назвв_функції має бути коректною назвою оболонки і не може збігатися із назвою однієї із спеціальних вбудованих команд POSIX. У типовому режимі назвою функції може бути будь-яке слово оболонки, що не містить лапок та символу $. Усі переспрямування (див. ПЕРЕСПРЯМУВАННЯ нижче), які вказано під час визначення функції, виконуватимуться під час виконання самої функції. Станом виходу визначення функції є нуль, якщо не буде виявлено синтаксичних помилок або призначеної лише для читання функції із тією самою назвою. При виконанні станом виходу функції є стан виходу останньої виконаної команди у її вмісті. (Див. ФУНКЦІЇ нижче.)

КОМЕНТАРІ

У неінтерактивній оболонці або у інтерактивній оболонці, у якій вбудованій команді shopt передано аргумент interactive_comments (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче), якщо почати слово #, то решту символів у відповідному рядку буде проігноровано. У інтерактивній оболонці без параметра interactive_comments можливості додавання коментарів не передбачено. Параметр interactive_comments у інтерактивних оболонках типово увімкнено.

НЕЙТРАЛІЗАЦІЯ

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

Усі метасимволи з наведено у розділі ВИЗНАЧЕННЯ списку мають особливе значення для оболонки — їх слід нейтралізувати, якщо вони мають бути просто буквальними словами.

Якщо використано можливості доповнення за журналом команд (див. ДОПОВНЕННЯ ЗА ЖУРНАЛОМ нижче), символ доповнення за журналом, зазвичай !, слід нейтралізувати для запобігання доповненню.

Передбачено три механізми нейтралізації: символ екранування, одинарні лапки і подвійні лапки.

Символ зворотної похилої риски без лапок (\) є символом екранування. Він зберігає буквальне значення наступного за ним символу, окрім символу <нового рядка>. Якщо буде виявлено пару \<новий рядок> і зворотну похилу риску не нейтралізовано символ \<новий рядок> буде оброблено як продовження рядка (тобто, його буде вилучено з потоку вхідних даних і, фактично, проігноровано).

Набір символів у одинарних лапках зберігає своє буквальне значення для кожного з символів у лапках. У межах взятого в одинарні лапки тексту не можна використовувати одинарні лапки, навіть якщо їх екрановано символом зворотної похилої риски.

Набір символів, взятий у подвійні лапки, зберігає буквальне значення для усіх символів у лапках, окрім символів $, `, \ і, якщо увімкнено доповнення за журналом, !. Якщо оболонка працює у режимі posix, ! не має особливого призначення у подвійних лапках, навіть якщо увімкнено доповнення за журналом. Символи $ і ` зберігають своє спеціальне значення у подвійних лапках. Символ зворотної похилої риски зберігає своє спеціальне значення, лише якщо за ним вказано один з таких символів: $, `, ", \ або <новий рядок>. Символ подвійних лапок можна екранувати у взятому у подвійні лапки фрагменті додаванням перед ним символу зворотної похилої риски. Якщо увімкнено доповнення за журналом, його буде виконано для !, якщо цей символ не екрановано символом зворотної похилої риски. Символ зворотної похилої риски перед ! не буде вилучено.

Спеціальні параметри * і @ зберігають спеціальне значення і у подвійних лапках (див. ПАРАМЕТРИ нижче).

Слова у формі $'рядок' оброблятимуться особливим чином. Слово буде розгорнуто до рядка рядок, а екрановані символом зворотної похилої риски буде замінено так, як це визначено стандартом ANSI C. Екрановані символом зворотної похилої риски послідовності, якщо такі буде виявлено, буде декодовано так:

гудок (дзвінок)
backspace
символ скасування
подавання бланку
новий рядок
повернення каретки
горизонтальна табуляція
вертикальна табуляція
\\
зворотна похила
\'
одинарна лапка
\"
подвійна лапка
\?
знак питання
восьмибітовий символ, значенням якого є вісімкове значення nnn (від однієї до трьох вісімкових цифр)
восьмибітовий символ, значенням якого є шістнадцяткове значення HH (від однієї до двох шістнадцяткових цифр)
символ Unicode (ISO/IEC 10646), чиїм значенням є шістнадцяткове значення HHHH (від однієї до чотирьох шістнадцяткових цифр)
символ Unicode (ISO/IEC 10646), чиїм значенням є шістнадцяткове значення HHHHHHHH (від однієї до восьми шістнадцяткових цифр)
символ control-x

Розгорнутий результат буде виразом в одинарних лапках, так, наче символу долара не було.

Взяття рядка у подвійні лапки, перед якими вказано символ долара ($"рядок") призведе до того, що рядок буде перекладено відповідно до поточної локалі. Пошук і переклад за каталогом повідомлень буде виконано інфраструктурою gettext з використанням змінних оболонки LC_MESSAGES та TEXTDOMAIN. Якщо поточною локаллю є C або POSIX, або якщо немає доступних перекладів, символ долара буде проігноровано. Якщо рядок буде перекладено і замінено, заміну буде взято у подвійні лапки.

ПАРАМЕТРИ

Параметром є запис, який зберігає значення. Це може бути назва, число або один із спеціальних символів, список яких наведено нижче у розділі Спеціальні параметри. Змінною будемо називати параметр, який позначено назвою. Змінна має значення і нуль, один або декілька атрибутів. Атрибути призначаються за допомогою вбудованої команди declare (див. declare нижче у розділі ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ).

Параметр встановлено, якщо йому надано значення. Коректним значенням є порожній рядок. Щойно змінну встановлено, встановлення можна скасувати лише за допомогою вбудованої команди unset (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).

Змінній можна надати значення за допомогою інструкції у формі

назва=[значення]

Якщо значення не задано, змінній буде надано значення порожнього рядка. У всіх значеннях буде виконано розгортання тильди, розгортання параметрів та змінних, заміни команд, арифметичні обчислення та вилучення лапок (див. РОЗГОРТАННЯ нижче). Якщо для змінної встановлено атрибут integer, значення буде обчислено як арифметичний вираз, навіть якщо не використано розгортання $((...)) (див. Арифметичні обчислення нижче). Поділ на слова не виконуватиметься за винятком "$@", як це пояснено нижче у розділі Спеціальні параметри. Розгортання шляхів до файлів не виконуватиметься. Інструкції визначення значень також можуть бути аргументами вбудованих команд alias, declare, typeset, export, readonly та local (команди оголошення). У режимі posix ці вбудовані команди можуть з'являтися у команді після одного або декількох екземплярів вбудованих команд команда і зберігати ці властивості інструкції встановлення значення.

У контексті, де інструкція встановлення значення визначає значення змінної оболонки або індексу масиву, оператором += можна скористатися для дописування або додавання до попереднього значення змінної. Це стосується аргументів вбудованих команд, зокрема declare, які приймають інструкції зі встановлення значень (команд оголошення). Якщо += застосовано до змінної, Для якої встановлено цілочисельний атрибут, значення буде обчислено як арифметичний вираз і додано до поточного значення змінної, яке теж буде обчислено. Якщо += застосовано до змінної-масиву за допомогою складеного встановлення значення (див. Масиви нижче), значення змінної буде встановлено (як це було б у результаті застосування =), а ові значення буде дописано до масиву, починаючи з індексу, що на одиницю більший за поточний максимальний індекс масиву (для індексованих масивів), або додано як додаткові пари ключ-значення в асоціативних масивах. При застосуванні до змінної із рядковим значенням значення буде розгорнуто і дописано до значення змінної.

Змінній можна встановити атрибут nameref за допомогою параметра -n вбудованих команд declare і local (див. опис команд declare і local нижче) для створення nameref або посилання на іншу змінну. У такий спосіб можна працювати зі змінними опосередковано. Кожного разу при посиланні на змінну nameref, встановленні її значення, скасуванні встановлення значення або внесенні змін до атрибутів (окрім використання та зміни самого атрибуту nameref) дію буде виконано зі змінною, назвою якої є значення змінної nameref. Типовим використанням nameref у функціях оболонки є посилання на змінну, чия назва передається як аргумент функції. Наприклад, якщо назву змінної передано до функції оболонки як її перший аргумент, виконання

declare -n ref=$1

у межах функції створює змінну nameref ref, чиїм значенням є назва змінної, яку передано як перший аргумент. Посилання і встановлення значень, а також зміну її атрибутів буде оброблено як посилання, встановлення значень та внесення змін до атрибутів змінної, чию назву було передано як $1. Якщо керівна змінна у циклі for має атрибут nameref, при виконанні циклу список слів може бути списком змінних оболонки, а посилання на назву буде встановлено для кожного слова у списку за чергою. Змінним-масивам не можна надавати атрибут nameref. Втім змінні nameref можу посилатися на змінні-масиви і підписані змінні-масиви. Можна скасовувати значення записів nameref за допомогою параметра -n вбудованої команди unset. Якщо не додати такий параметр, при виконанні unset із аргументом назви змінної nameref буде скасовано встановлення назви для змінної, на яку посилається змінна nameref.

Позиційні параметри

Позиційний параметр — параметр, який позначено однією або декількома цифрами, окрім одинарної цифри 0. Значення позиційних параметрів встановлюються з аргументів оболонки при її виклику. Змінити значення параметрів можна за допомогою вбудованої команди set. Встановлювати значення позиційних параметрів не можна за допомогою звичайних інструкцій встановлення значень. Позиційні параметри тимчасово замінюються при виклику функції оболонки (див. ФУНКЦІЇ нижче).

Для розгортання позиційних параметрів, які складаються з декількох цифр, їх слід вказувати у фігурних дужках (див. РОЗГОРТАННЯ нижче).

Спеціальні параметри

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

*
Розгортається у позиційні параметри, починаючи з першого. Якщо розгорнутий текст не перебуває у подвійних лапках, кожен позиційний параметр розгортатиметься в окреме слово. У контексті виконання ці слова підлягають подальшому поділу на слова і розгортанню назв шляхів. Якщо розгортання відбувається у подвійних лапках, воно відбуватиметься до одного слова, що складатиметься зі значень усіх параметрів, які буде відокремлено першим символом спеціальної змінної IFS. Тобто, "$*" еквівалентне до "$1c$2c...", де c — перший символ значення змінної IFS. Якщо значення змінної IFS не встановлено, параметри буде відокремлено пробілами. Якщо значення IFS є порожнім, параметри буде з'єднано без проміжних роздільників.
@
Розгортається у позиційні параметри, починаючи з першого. У контекстах, де виконується поділ на слова кожен позиційний параметр буде розгорнуто до окремого слова. Якщо розгортання відбувається не у подвійних лапках, ці слова також буде поділено на окремі слова. У контекстах, де не виконується поділу на слова, розгортання відбувається до одного слова, у якому позиційні параметри буде відокремлено пробілом. Якщо розгортання відбувається у подвійних лапках, кожен параметр розгорається до окремого слова. Тобто, "$@" еквівалентне до "$1" "$2" ... Якщо розгортання у подвійних лапках відбувається у межах слова, результат розгортання першого параметра об'єднується із початковою частиною початкового слова, а результат розгортання останнього параметра об'єднується із останньою частиною початкового слова. Якщо позиційних параметрів немає, "$@" і $@ ні до чого не розгортаються (тобто, їх буде вилучено).
#
Розгортається до числа позиційний параметрів у десятковому записі.
?
Розгортається до коду стану виходу останнього виконаного конвеєра переднього плану.
-
Розкриває прапорці поточних опцій, що вказані при виклику, через вбудовану команду set, або встановлені самою оболонкою (як опція -i).
$
Розкриває ІД процесу оболонки. В підоболонці (), воно розкриває до ІД процесу поточної оболонки, а не підоболонки.
!
Розкриває ІД процесу завдання, що було покладено у фон останнім, або викликане асинхронною командою або черед вбудоване bg (див. JOB CONTROL нижче).
0
Розкриває назву оболонки або скрипту оболонки. Воно встановлене під час ініціалізації оболонки. Якщо bash викликано файлом команд, $0 встановлюється в назву того файлу. Якщо bash запущено з опцією -c, тоді $0 встановлюється в перший аргумент після рядка для виконання, якщо він присутній. Інакше, воно встановлюється в назву файлу, якого використали для запуску bash, як надано нульовим аргументом.

Змінні оболонки

Оболонка встановлює значення таких змінних:

_
Під час запуску оболонки отримує значення шляху, який використано для виклику оболонки або назви скрипту, який виконується, у тому вигляді, у якому його передано у середовищі, або списку аргументів. Далі, після розгортання, розгортається до останнього аргументу попередньої простої команди, яку виконано в основному режимі. Також отримує значення повного шляху, який використано для виклику кожної виконаної команди, і записується до середовища, яке експортовано для цієї команди. При перевірці пошти цей параметр містить назву поштового файла, перевірку якого виконує програма.
Розгортається до повної назви файла, використано для виклику цього екземпляра bash.
Список відокремлених двокрапками увімкнених параметрів оболонки. Кожне слово у списку є коректним аргументом параметра -s вбудованої команди shopt (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Параметри, які з'являються у списку BASHOPTS, є тими параметрами, про які shopt звітує, як про увімкнені. Якщо у середовищі є ця змінна, при запуску bash кожен параметр оболонки у списку буде увімкнено до читання будь-яких файлів запуску. Цю змінну призначено лише для читання.
Розгортається до ідентифікатора поточного процесу bash. Це значення, за певних обставин, зокрема підоболонок, які не потребують повторної ініціалізації bash, відрізняється від $$. Спроба встановлення значення BASHPID ні на що не вплине. Якщо скасувати встановлення BASHPID, змінна втрачає свої особливі властивості, навіть якщо згодом значення буде повторно встановлено.
Змінна-асоціативний масив, елементи якого відповідають внутрішньому списку псевдонімів, який підтримується вбудованим засобом alias. Елементи, додані до цього масиву, відображаються в списку псевдонімів; однак скасування елементів масиву наразі не призводить до видалення псевдонімів зі списку псевдонімів. Якщо скасувати встановлення BASH_ALIASES, змінна втрачає свої особливі властивості, навіть якщо її згодом перевстановити.
Змінна-масив, значеннями якої є кількості параметрів у кожному кадрі поточного стека викликів виконання bash. Кількість параметрів поточної підпрограми (функції оболонки або сценарію, що виконується за допомогою . або source) міститься на вершині стека. Коли виконується підпрограма, кількість переданих параметрів передається в BASH_ARGC. Оболонка встановлює BASH_ARGC лише в режимі розширеного налагодження (див. нижче опис параметра extdebug вбудованого засобу shopt). Встановлення extdebug після того, як оболонка почала виконувати сценарій, або посилання на цю змінну, коли extdebug не встановлено, може призвести до невідповідних значень.
Змінна-масив, яка містить всі параметрів у поточному стеку викликів виконання bash. Останній параметр останнього виклику підпрограми міститься на вершині стека; перший параметр початкового виклику - внизу. Коли виконується підпрограма, надані параметри передаються в BASH_ARGV. Оболонка встановлює BASH_ARGV лише в режимі розширеного налагодження (див. нижче опис параметра extdebug вбудованого засобу shopt). Встановлення extdebug після того, як оболонка почала виконувати сценарій, або посилання на цю змінну, коли extdebug не встановлено, може призвести до невідповідних значень.
При посиланні ця змінна розширюється до назви оболонки або сценарію оболонки (ідентичне $0; див. опис спеціальних параметрів 0 вище). Присвоєння BASH_ARGV0 призводить до присвоєння того ж значення $0. Якщо скасувати встановлення BASH_ARGV0, вона втрачає свої особливі властивості, навіть якщо її згодом перевстановити.
Змінна-асоціативний масив, елементи якого відповідають внутрішній геш-таблиці команд, якe підтримує вбудований засіб hash. Елементи, додані до цього масиву, з'являються в геш-таблиці; однак скасування елементів масиву наразі не призводить до видалення назв команд із геш-таблиці. Якщо скасувати встановлення BASH_CMDS, змінна втрачає свої особливі властивості, навіть якщо її згодом перевстановити.
Команда, яка зараз виконується або має виконуватись, якщо оболонка не виконує команду в результаті пастки, і в цьому випадку це команда, яка виконується під час пастки. Якщо скасувати встановлення BASH_COMMAND, змінна втрачає свої особливі властивості, навіть якщо її згодом перевстановити.
Аргумент команди до параметра виклику -c.
Змінна-масив, чиї елементи є номерами рядків у файлах початкового коду, де викликано кожен відповідний елемент FUNCNAME. ${BASH_LINENO[$i]} є номером рядка у файлі початкового коду (${BASH_SOURCE[$i+1]}), де було викликано ${FUNCNAME[$i]} (або ${BASH_LINENO[$i-1]}, якщо на нього посилаються у іншій функції оболонки). Для отримання номера поточного рядка скористайтеся LINENO.
Список відокремлених двокрапками каталогів, у яких оболонка буде шукати динамічно завантажувані вбудовані команди, які вказано командою enable.
Змінна-масив, чиїм елементам надають значення за допомогою двійкового оператора =~ у команді умови [[. Елемент із індексом 0 є частиною рядка, яка точно відповідає усьому формальному виразу. Елемент із індексом n є частиною рядка, яка відповідає n-ій взятій у круглі дужки частині виразу.
Змінна-масив, чиїми елементами є назви файлів початкового коду, де визначено відповідні назви функцій оболонки у змінній-масиві FUNCNAME. Функцію оболонки ${FUNCNAME[$i]} визначають у файлі ${BASH_SOURCE[$i]} і викликають з ${BASH_SOURCE[$i+1]}.
Збільшується на одиницю із кожним переходом до наступної підоболонки або середовища підоболонки, якщо оболонку запускають у цьому середовищі. Початковим значенням є 0. Якщо не встановлено значення BASH_SUBSHELL, втрачає свої особливі властивості, навіть якщо згодом значення буде встановлено.
Призначена лише для читання змінна-масив, чиїми елементами є дані щодо версії поточного екземпляра bash. Елементи масиву мають такі значення:
Номер основної версії (випуск).
Номер проміжної версії (версія).
Рівень латки.
Версія збірки.
Стан випуску (наприклад, beta1).
Значення MACHTYPE.
Розгортається до рядка, який описує версію цього екземпляра bash.
Індекс у ${COMP_WORDS} слова, на якому перебуває курсор. Доступ до цієї змінної можна отримати лише у функціях оболонки, які викликають можливості програмованого доповнення тексту (див. Програмоване доповнення нижче).
Клавіша (або кінцева клавіша у послідовності клавіш), яка викликає поточну функцію доповнення.
Поточний рядок команди. Ця змінна доступна лише у функціях оболонки та зовнішніх командах, які викликано можливостями програмованого доповнення (див. Програмоване доповнення нижче).
Індекс поточної позиції курсора відносно початку поточної команди. Якщо поточною позицією курсора є кінець поточної команди, значення цієї змінної дорівнює ${#COMP_LINE}. Ця змінна доступна лише у функціях оболонки та зовнішніх командах, які викликано можливостями програмованого доповнення (див. Програмоване доповнення нижче).
Встановлюють ціле значення, яке відповідає типу доповнення, яке призвело до виклику функції доповнення: TAB — звичайне доповнення, ? — доповнення за списком після послідовного натискання клавіші табуляції, ! — доповнення за списком варіантів при доповненні за частиною слова, @ — доповнення за списком, якщо слово лишається незмінним, або % — доповнення за меню. Ця змінна є доступною, лише у функціях оболонки і зовнішніх командах, які викликають можливості програмованого доповнення (див. Програмоване доповнення нижче).
Набір символів, які бібліотека readline обробляє як роздільники слів при виконанні доповнення слів. Якщо не встановлено значення COMP_WORDBREAKS, втрачає свої особливі властивості, навіть якщо значення цієї змінної буде надалі встановлено повторно.
Змінна-масив (див. Масиви нижче), що складається з окремих слів у поточному рядку команди. Рядок буде поділено на слова так, як його ділить readline, з використанням COMP_WORDBREAKS, як це описано вище. Ця змінна доступна лише у функціях оболонки, які викликають можливості програмованого доповнення (див. Програмоване доповнення нижче).
Змінна-масив (див. Масиви нижче), яку створено для зберігання дескрипторів файлів для виведення та введення даних для копроцесу без назви (див. Копроцеси вище).
Змінна-масив (див. Масиви нижче), яка містить поточний вміст стосу каталогів. Каталоги буде розташовано у стосі у тому ж порядку, що і у списку, показаному вбудованою командою dirs. Встановленням значення для елементів цього масиву можна скористатися для внесення змін до записів каталогів у стосі, але додавання та вилучення каталогів слід користуватися вбудованими командами pushd і popd. Встановлення значення цієї змінної не змінюватиме поточного каталогу. Якщо значення DIRSTACK не встановлено, змінна втрачає свої особливі властивості, навіть якщо значення згодом буде встановлено.
Кожне посилання на цей параметр буде розгорнуто до кількості секунд з моменту початку епохи Unix (див. time(3)) у форматі з рухомою крапкою і точністю до мікросекунд. Спроби встановити значення для EPOCHREALTIME буде проігноровано. Якщо значення EPOCHREALTIME не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Кожне посилання на цей параметр буде розгорнуто до кількості секунд з моменту початку епохи Unix (див time(3)). Спроби встановити значення для EPOCHSECONDS буде проігноровано. Якщо значення EPOCHSECONDS не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Розгортається до ідентифікатора ефективного користувача поточного користувача. Ініціалізується під час запуску оболонки. Цю змінну призначено лише для читання.
Змінна-масив, яка містить назви усіх функцій оболонки у поточному стеку викликів. Елемент із індексом 0 є назвою будь-якої функції оболонки, яка виконується у поточний момент. Найнижчим елементом у списку (елементом із найбільшим індексом) є "main". Ця змінна існує лише тоді, коли виконується функція оболонки. Спроби встановити значення FUNCNAME буде проігноровано. Якщо значення FUNCNAME не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.

Цією змінною можна скористатися у поєднанні із BASH_LINENO та BASH_SOURCE. У кожного елемента FUNCNAME є відповідні елементи у BASH_LINENO та BASH_SOURCE для опису стека викликів. Наприклад, ${FUNCNAME[$i]} було викликано з файла ${BASH_SOURCE[$i+1]} у рядку з номером ${BASH_LINENO[$i]}. На основі цієї інформації показує дані щодо поточного стекла викликів вбудована команда caller.

Змінна-масив, яка містить список груп, учасником яких є поточний користувач. Спроби встановити значення GROUPS буде проігноровано. Якщо значення GROUPS не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Номер у журналі або індекс у списку журналу поточної команди. Спроби встановити значення HISTCMD буде проігноровано. Якщо значення HISTCMD не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Автоматично заповнюється назвою поточного вузла.
Автоматично встановлюється значення рядка, який унікальним чином описує тип комп'ютера, на якому запущено bash. Типове значення залежить від системи.
Кожне посилання на цей параметр буде замінено на десяткове число, яке відповідає поточному послідовному номеру рядка (відлік починається з 1) у скрипті або функції. Якщо параметр використано не у скрипті або функції, підставлене значення може бути беззмістовним. Якщо значення LINENO не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Автоматично встановлюється значення рядка, який повністю описує тип операційної системи, у якій запущено bash у форматі, який визначено стандартом GNU процесор-компанія-система. Типове значення залежить від системи.
Змінна-масив (див Масиви нижче), яку створено для зберігання тексту, який прочитано за допомогою вбудованої команди mapfile, яку виконано без визначення назви змінної.
Попередній робочий каталог, який було встановлено командою cd.
Значення останнього аргументу параметра, яке оброблено вбудованою командою getopts (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).
Індекс наступного аргументу параметра, який буде оброблено вбудованою командою getopts (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).
Автоматично встановлюється значення рядка, який описує операційну систему, у якій запущено bash. Типове значення залежить від системи.
Змінна-масив (див Масиви нижче), у якій зберігається список значень кодів стану виходу від процесів у найсвіжішому виконаному основному конвеєрі команд (який може містити і лише одну команду).
Ідентифікатор процесу батьківського процесу оболонки. Цю змінну призначено лише для читання.
Поточний робочий каталог, який було встановлено командою cd.
Кожен раз, коли використовується цей параметр, програма розгортає його до випадкового цілого числа у межах від 0 до 32767. Наданням RANDOM значення можна ініціалізувати послідовність псевдовипадкових чисел. Якщо значення RANDOM не встановлено, змінна втрачає особливі властивості, навіть якщо її значення згодом буде встановлено повторно.
Вміст буфера рядків readline для використання з "bind -x" (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).
Позиція позначки (збереженої точки вставлення) у буфері рядків readline для використання з "bind -x" (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Символи між точкою вставлення та позначкою часто називають регіоном.
Позиція точки вставлення у буфері рядків readline для використання з "bind -x" (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).
Встановлюється значення рядка вхідних даних, який прочитано командою read, якщо цій команді не передано жодних аргументів.
Кожен запис цього параметра буде замінено на кількість секунд, які минули із моменту виклику оболонки. Якщо інструкцією буде встановлено значення SECONDS, значення яким буде замінено наступні записи параметра визначатиметься як кількість секунд, які минули з моменту встановлення значення разом із встановленим значенням. Кількість секунд з моменту виклику оболонки та поточний час завжди визначатиметься за допомогою запитів до годинника системи. Якщо значення SECONDS не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Список відокремлених двокрапками увімкнених параметрів оболонки. Кожне слово у списку є коректним аргументом параметра -o вбудованої команди set (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Параметри, які з'являються у списку SHELLOPTS, є тими параметрами, про які set -o звітує, як про увімкнені. Якщо у середовищі є ця змінна, при запуску bash кожен параметр оболонки у списку буде увімкнено до читання будь-яких файлів запуску. Цю змінну призначено лише для читання.
Збільшується на одиницю кожного разу, коли запускається екземпляр bash.
Кожен запис цієї змінної розгортається у 32-бітове псевдовипадкове число. Генератор випадкових чисел є нелінійним у системах, де передбачено підтримку /dev/urandom або arc4random, отже усі повернуті числа не пов'язано із попередніми. Встановлення бази випадковості не передбачено, тому спроби встановлення для цієї змінної значення буде проігноровано. Якщо значення SRANDOM не встановлено, змінна втрачає свої особливі властивості, навіть якщо згодом її значення буде встановлено.
Розгортається до ідентифікатора поточного користувача. Ініціалізується під час запуску оболонки. Цю змінну призначено лише для читання.

Оболонка використовує описані нижче змінні. У деяких випадках bash призначає типове значення змінної. Нижче для таких випадків наведено нотатки.

Значення використовують для встановлення рівня сумісності оболонки. Опис різних рівнів сумісності та їхнього впливу на роботу оболонки наведено у розділі РЕЖИМ СУМІСНОСТІ ОБОЛОНКИ. Значення може бути десятковий дріб (наприклад, 4.2) або ціле число (наприклад, 42), яке відповідає бажаному рівню сумісності. Якщо значення BASH_COMPAT не встановлено або встановлено значення порожнього рядка, рівень сумісності буде типовим для поточної версії програми. Якщо для BASH_COMPAT встановлено значення, яке не є коректним значенням рівня сумісності, оболонка виведе повідомлення про помилку і встановить рівень сумісності, який є типовим для поточної версії оболонки. Коректні рівні сумісності описано нижче у розділі BРЕЖИМСУМІСНОСТІОБОЛОНКИ. Наприклад, 4.2 і 42 є коректними значеннями, які відповідають параметру compat42 команди shopt і встановлюють рівень сумісності 42. Коректним значенням також є номер поточної версії оболонки.
Якщо встановлено значення цього параметра, коли bash виконує скрипт оболонки, це значення буде оброблено як назву файла, який містить команди для ініціалізації оболонки, як у ~/.bashrc. Значення BASH_ENV буде оброблено із розгортанням параметрів, заміною команд та арифметичними обчисленнями, перш ніж його буде використано як назву файла. Для пошуку потрібного файла не буде використано змінну PATH.
Якщо встановлено значення цілого числа, яке відповідає коректному дескриптору файла, bash запише створені під час виконання дані трасування, якщо увімкнено set -x для цього дескриптора файла. Дескриптор файла буде закрито у відповідь на скасування встановлення значення BASH_XTRACEFD або встановлення нового значення для цієї змінної. Якщо значення BASH_XTRACEFD не встановлено або встановлено значення порожнього рядка, дані трасування буде надіслано до стандартного виведення помилок. Зауважте, що встановлення для BASH_XTRACEFD значення 2 (дескриптор файла стандартного виведення помилок) з наступним скасуванням встановлення значення призведе до закриття стандартного виведення помилок.
Шлях пошуку для команди cd. Це список записів каталогів, які відокремлено двокрапками, у якому оболонка шукатиме каталоги призначення, які вказано командою cd. Зразок значення: ".:~:/usr".
Встановити кількість значень стану завершених дочірніх процесів, які має зберігати оболонка. Bash забороняє зменшення цього значення до рівня, який є нижчим за обов'язковий мінімум POSIX. Передбачено також максимальне значення (у поточній версії 8192), яке теж не можна перевищувати. Мінімальне значення залежить від системи.
Використовується у складеній команді select для визначення ширини термінала при виведенні списків вибору. Буде встановлено автоматично, якщо увімкнено параметр checkwinsize або в інтерактивній оболонці при отриманні SIGWINCH.
Змінна-масив, з якої bash читає можливі доповнення, створені функцією оболонки, яку викликано можливостями програмованого доповнення (див. Програмоване доповнення нижче). У кожному з елементів масиву міститься можливий варіант доповнення.
Якщо bash виявить цю змінну у середовищі, коли оболонку буде запущено зі значенням "t", програма припускатиме, що оболонку запущено у режимі буфера оболонки Emacs, і вимкне редагування рядка.
Розгортається і виконується подібно до BASH_ENV (див. ВИКЛИК вище) при виклику інтерактивної оболонки у режимі posix.
Список відокремлених двокрапками взірців оболонки (див. Відповідність за взірцем), який визначає список назв файлів, які буде проігноровано при пошуку команди із використанням PATH. Файли, назви яких збігатимуться з одним із цих взірців не вважатимуться виконуваними у списку доповнення і виконання команд при пошуку у каталогах PATH. Це не стосуватиметься поведінки команд [, test і [[. Використання EXECIGNORE не стосується повних шляхів до файлів у таблиці хешів команд. Цією змінною можна скористатися для ігнорування файлів бібліотек спільного використання, для яких встановлено біт виконання, але які не є виконуваними файлами. При встановленні відповідності взірцю буде враховано значення параметра оболонки extglob.
Типовий редактор для вбудованої команди fc.
Список відокремлених двокрапками суфіксів, які слід ігнорувати під час автоматичного доповнення назв файлів (див. READLINE нижче). Назви файлів, чиї суфікси збігаються із одним із записів у FIGNORE, буде виключено зі списку відповідних назв файлів. Зразок значення ".o:~".
Якщо встановлено числове додатне значення, визначає максимальний рівень вкладеності функцій. Виклики функцій, у яких перевищено рівень вкладеності, призводять до аварійного завершення виконання поточної команди.
Список відокремлених двокрапками взірців, який визначає набір назв файлів, які буде проігноровано при розгортанні шляхів. Якщо назва файла відповідає взірцю розгортання шляху також відповідає одному із взірців у GLOBIGNORE, її буде вилучено зі списку відповідників.
Список відокремлених двокрапками значень, які визначають спосіб збереження команд у списку журналу. Якщо до списку значень включено ignorespace, рядки, які починаються з символу пробілу не буде збережено у списку журналу. Значення ignoredups призведе до того, що рядки, які збігаються із попереднім записом у журналі, не буде збережено. Значення ignoreboth є скороченням для поєднання ignorespace і ignoredups. Значення erasedups призведе до того, що усі попередні рядки, які збігаються із поточним рядком буде вилучено зі списку журналу перед збереженням у ньому поточного рядка. Усі інші значення, окрім описаних вище, буде проігноровано. Якщо не встановлено значення HISTCONTROL або у встановленому значенні немає коректних записів, обробник читатиме і зберігатиме у списку журналу усі рядки, які узгоджуються зі значенням HISTIGNORE. Другий і наступні рядки багаторядкових складених команд не перевірятимуться, їх буде додано до журналу без врахування значення HISTCONTROL.
Назва файла, у якому буде збережено журнал команд (див. HISTORY нижче). Типовим значенням є ~/.bash_history. Якщо значення не встановлено, при виході з оболонки журнал команд збережено не буде.
Максимальна кількість рядків, які можуть міститися у файлі журналу. Якщо цій змінній надано значення, файл журналу буде обрізано, якщо це потрібно, так, щоб у ньому містилося не більше вказаної кількості рядків — буде вилучено найстаріші записи. Файл журналу також буде обрізано до цього розміру після запису до нього під час виходу з оболонки. Якщо значенням змінної є 0, файл журналу буде обрізано до нульового розміру. Нечислові значення або від'ємні числові значення призводять до заборони обрізання. Оболонка встановлює типове значення за значенням HISTSIZE після читання усіх файлів запуску оболонки.
Список відокремлених двокрапками взірців, які буде використано для вибору команд, які слід зберегти у списку журналу. Кожен взірець буде прив'язаний до початку рядка і має збігатися із усім рядком (без неявного додавання «*»). Перевірку відповідності кожного з взірців рядку буде виконано після застосування перевірок, які визначено HISTCONTROL. Окрім звичайних символів відповідності взірців, «&» відповідає попередньому рядку у журналі. «&» можна екранувати за допомогою символу зворотної похилої риски; зворотну похилу риску буде вилучено перед спробою встановлення відповідності. Перевірка другого і наступних рядків багаторядкової складеної команди не виконуватиметься — ці рядки буде додано до журналу, незалежно від значення HISTIGNORE. При встановленні відповідності за взірцем буде враховано значення параметра оболонки extglob.
Кількість команд, які слід зберігати у журналі команд (див. ЖУРНАЛ нижче). Якщо значенням є 0, збереження команд до списку команд не виконуватиметься. Якщо значення є від'ємним, до списку журналу зберігатимуться усі команди (без обмежень на кількість). Після читання файлів запуску оболонка встановлює типове значення 500.
Якщо ця змінна встановлена і її значення не порожнє (null), воно використовується як рядок форматування strftime(3) щоб надрукувати позначку часу, пов’язану з кожним записом журналу, що виводиться вбудованою командою history. Якщо ця змінна встановлена, мітки часу записуються до файлу журналу, щоб вони могли зберігатися протягом сеансів оболонки. Щоб відрізнити позначки часу від інших рядків журналу, використовується символ коментаря журналу.
Домашній каталог поточного користувача; типовий аргумент для вбудованої команди cd. Значення цієї змінної також використовується при розгортанні записів із тильдою.
Містить назву файла у тому самому форматі, що і /etc/hosts яку слід прочитати, коли оболонка має доповнити назву вузла. Список можливих завершень назви вузла можна змінити під час роботи оболонки; за наступної спроби завершення назви вузла після зміни значення, bash додасть вміст нового файлу до наявного списку. Якщо HOSTFILE встановлено, але не має значення або не називає файлу для читання, bash намагається прочитати /etc/hosts для отримання списку можливих варіантів завершення назви вузла. Якщо надати HOSTFILE порожнє значення, список назв вузлів буде спорожнено.
Внутрішній роздільник полів (Internal Field Separator), який буде використано для поділу тексту на слова після розгортання і для поділу рядків на слова за допомогою вбудованої команди read. Типовим значенням є “<space><tab><newline>”.
Визначає дію інтерактивної оболонки у відповідь на отримання символу EOF як єдиного елемента вхідних даних. Якщо встановлено значення, воно вважатиметься кількістю послідовних символів EOF, які має бути введено як перші символи рядків вхідних даних, перш ніж bash завершить роботу. Якщо змінна існує, але не має числового значення або взагалі не має значення, буде використано типове значення 10. Якщо змінної не існуватиме, для оболонки EOF буде кінцем введення.
Назва файла запуску readline. Перевизначає типову назву ~/.inputrc (див. READLINE нижче).
Якщо у середовищі є ця змінна на момент запуску оболонки, bash припускає, що програму запущено всередині буфера оболонки і може вимкнути редагування рядків, залежно від значення змінної TERM.
Використовується для визначення категорії локалі для усіх категорій, які не було окремо вибрано за допомогою змінної, назва якої починається з LC_.
Значення цієї змінної має вищий пріоритет за значення LANG та будь-якої іншої змінної LC_, яка визначає категорію локалі.
Ця змінна визначає порядок сортування, який буде використано при упорядковуванні результатів розгортання шляхів до файлів, та визначає поведінку при розгортанні діапазонів, класів еквівалентності та схем упорядковування при розгортанні шляхів та встановленні відповідності за взірцем.
Ця змінна визначає спосіб обробки символів та поведінку класів символів при розгортанні шляхів до файлів та встановленні відповідності за взірцем.
Ця змінна визначає локаль, яку буде використано для трансляції рядків у подвійних лапках, яким передує символ $.
Ця змінна визначає категорію локалей, яку буде використано для форматування чисел.
Ця змінна визначає категорію локалей, яку буде використано для форматування записів дати і часу.
Використовується у складеній команді select для визначення довжини стовпчика при виведенні списків вибору. Буде встановлено автоматично, якщо увімкнено параметр checkwinsize або в інтерактивній оболонці при отриманні SIGWINCH.
Якщо для цього параметра встановлено значення назви файла або каталогу, і не встановлено значення змінної MAILPATH, bash повідомлятиме користувачеві про надходження пошти до вказаного файла або каталогу у форматі Maildir.
Визначає наскільки часто (у секундах) bash має перевіряти пошту. Типовим значенням є 60 секунд. Коли настане момент перевірити пошту, оболонка виконає відповідні дії до показу основного запиту. Якщо значення цієї змінної не встановлено або встановлено значення, яке не є додатним або нульовим, оболонка вимкне перевірку пошти.
Список відокремлених двокрапками назв файлів, у яких слід шукати пошту. Повідомлення, яке буде виведено при надходженні пошти до певного файла, можна вказати, відокремивши назву файла від повідомлення за допомогою «?». Якщо використати $_ у тексті повідомлення, змінну буде розгорнуто до назви поточного поштового файла. Приклад:

MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'

Bash можна налаштувати на надання типового значення для цієї змінної (стандартного значення не передбачено), але розташування файлів пошти користувача, яке використовуватиме оболонка, залежить від системи (наприклад, /var/mail/$USER).

Якщо встановлено значення 1, bash виводитиме повідомлення про помилки, які створено вбудованою командою getopts (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). OPTERR буде ініціалізовано значенням 1 кожного разу, коли викликатиметься оболонка або виконуватиметься скрипт оболонки.
Шлях пошуку для команд. Це список відокремлених двокрапками записів каталогів, у яких оболонка шукатиме команди (див. ВИКОНАННЯ КОМАНД нижче). Назва каталогу нульової довжини (null) у значенні PATH позначає поточний каталог. Порожня назва каталогу може з'являтися як два сусідніх стовпчики або початковий чи кінцевий стовпчик. Типовий шлях залежить від системи і визначається адміністратором, який встановив bash. Стандартним значенням є ``/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin''.
Якщо ця змінна є частиною середовища на момент запуску bash, оболонка перейде у режим posix до читання файлів запуску, так, наче було вказано параметр виклику --posix. Якщо встановити значення змінної під час роботи оболонки, bash увімкне режим posix так, наче було виконано команду set -o posix Коли оболонка переходить у режим posix, вона встановлює значення для цієї змінної, якщо це значення ще не було встановлено.
Якщо встановлено значення цієї змінної, і цим значенням є масив, о показу кожного з основних запитів буде виконано значення кожного із елементів масиву. Якщо значення встановлено, але воно не є масивом, це значення буде використано як команду, яку слід виконати.
Якщо встановлено додатне значення, це значення буде використано як кількість кінцевих компонентів запису каталогу, які слід зберегти при розгортанні екранованих послідовностей запитів \w і \W (див. ЗАПИТИ нижче). Вилучені символи буде замінено трьома крапками.
Значення цього параметра буде розгорнуто (див. ЗАПИТИ нижче) і виведено інтерактивними оболонками після читання команди і перед її виконанням.
Значення цього параметра розгортається (див. ЗАПИТИ нижче) і використовується як основний рядок запиту. Типове значення — “\s-\v\$ ”.
Значення цього параметра розгортається, як з PS1, і використовується як вторинний рядок запиту. Типове значення — “> ”.
Значення цього параметра використовується як запит для команди select (див. ГРАМАТИКА ОБОЛОНКИ вище).
Значення цього параметра буде розгорнуто, як і PS1, а значення буде виведено перед кожною командою, яку bash виведе під час виконання. Перший символ розгорнутого значення PS4, за потреби, буде відтворено декілька разів для позначення декількох рівнів опосередкованості. Типовим значенням є “+ ”.
Ця змінна розгортається до повного шляху до оболонки. Якщо не встановлено під час запуску оболонки, bash встановлює для неї значення повного шляху до оболонки входу до системи поточного користувача.
Значення цього параметра використовується як рядок формату, що визначає, як слід показувати інформацію про час для конвеєрів із префіксом time. Символ % розпочинає escape-послідовність, яка розширюється до значення часу або іншої інформації. Escape-послідовності та їх значення такі; дужки позначають необов'язкові частини.
%%
Символ %.
%[p][l]R
Тривалість виконання у секундах.
%[p][l]U
Кількість секунд, протягом яких процесор було задіяно у режимі користувача.
%[p][l]S
Кількість секунд, протягом яких процесор було задіяно у режимі системи.
%P
Частка часу процесора, яку обчислено за формулою (%U + %S) / %R.
Необов'язкове p є цифрою, яка визначає точність, кількість цифр дробової частини після десяткової крапки. Значення 0 означає, що не слід виводити ні крапку, ні дробову частину. Можна вказати до трьох позицій після десяткової крапки; значення p, які є більшим за 3, буде просто замінено на 3. Якщо p не вказано, буде використано значення 3.
Необов'язкове l визначає довгий формат, включено із хвилинами, форми MMmSS.FFs. Значення p визначає, чи слід включати дробову частину.
Якщо значення цієї змінної не встановлено, bash працюватиме так, наче вона має значення $'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'. Якщо значення є порожнім, дані щодо часу виведено не буде. При виведенні рядка форматування буде додано кінцевий символ нового рядка.
Якщо встановлено додатне значення, TMOUT вважатиметься типовим часом очікування для вбудованої команди read. Команда select завершить роботу, якщо вхідні дані не буде отримано протягом TMOUT секунд, якщо вхідні дані надходять з термінала. В інтерактивній оболонці значення буде використано як кількість секунд, протягом яких слід очікувати на рядок вхідних даних після показу основного запиту. Bash завершить роботу після очікування протягом вказаної кількості секунд, якщо не буде отримано повного рядка вхідних даних.
Якщо встановлено, bash використовує значення як назву каталогу, у якому bash створює тимчасові файли для використання в оболонці.
Ця змінна керує тим, як оболонка взаємодіє із користувачем і керуванням завданнями. Якщо встановлено значення цієї змінної, прості команди з одного слова без переспрямувань вважатимуться кандидатами на відновлення наявного зупиненого завдання. Двозначність заборонено: якщо існує декілька завдань, записи яких починаються із введеного рядка, буде вибрано завдання, доступ до якого було здійснено останнім. Назва зупиненого завдання у цьому контексті є рядком команди, яку використано для його запуску. Якщо встановлено значення exact, визначений рядок має відповідати назві зупиненого завдання точно; якщо встановлено значення substring, визначений рядок має збігатися із підрядком у назві зупиненого завдання. Значення substring працює подібно до ідентифікатора завдання %? (див. КЕРУВАННЯ ЗАВДАННЯМИ нижче). Якщо встановлено будь-яке інше значення, визначений рядок має бути префіксом назви зупиненого завдання; це працює подібно до ідентифікатора завдання %рядок.
Два або три символи, які керують доповненням за журналом та поділом на жетони (див. ДОПОВНЕННЯ ЗА ЖУРНАЛОМ нижче). Перший символ є символом доповнення за журналом, символом, який сигналізує про початок доповнення за журналом, зазвичай, «!». Другий символ є символом швидкого підставляння, який використовують як скорочення для повторного запуску попередньої введеної команди, із заміною одного рядка на інший у команді. Типовим є символ «^». Необов'язковий третій символ є символом, який позначає, що решта рядка є коментарем, якщо буде виявлено, що це перший символ слова. Зазвичай, цим символом є «#». Поява символу коментаря у журналі призводить до того, що заміну за журналом у решті слів рядка буде пропущено. Це не обов'язково призведе до того, що засіб обробки команд оболонки вважатиме решту рядка коментарем.

Масиви

У bash передбачено одновимірні індексовані та асоціативні змінні-масиви. Як індексований масив можна використати будь-яку змінну. Масив явним чином оголошується вбудованою командою declare. Обмеження на максимальний розмір масиву не передбачено, як і вимоги, щоб усі елементи було індексовано або асоційовано неперервно. Посилання на елементи індексованих масивів здійснюється за допомогою цілих чисел (включно із арифметичними виразами). Нумерація починається з нуля. Посилання на елементи асоціативних масивів здійснюється з використанням довільних рядків. Якщо це явно не визначено, індекси в індексованому масиві мають бути невід'ємними цілими числами.

Індексований масив буде створено автоматично, якщо будь-якій змінній буде надано значення з використанням синтаксичної конструкції назва[підпис]=значення. Значення підпис буде оброблено як арифметичний вираз, результатом обчислення якого має бути число. Щоб явним чином оголосити індексований масив, скористайтеся командою declare -a назва (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Також можна скористатися командою declare -a назва[підпис]; підпис буде проігноровано.

Асоціативні масиви створюють через declare -A назва.

Атрибути змінної-масиву можна вказати за допомогою вбудованих команд declare і readonly. Кожен атрибут застосовується до усіх елементів масиву.

Надати масиву значення можна за допомогою складених синтаксичних конструкцій встановлення значень у формі назва=(значення1 ... значенняn), де кожне значення можна вказувати у формі [підпис]=рядок. Для індексованих масивів достатньо вказати лише рядок. Кожне значення у списку розгортається з використанням усіх розгортань в оболонці, які описано нижче у розділі РОЗГОРТАННЯ. При встановленні значення у індексованих масивах, якщо вказано необов'язкові дужки і підпис, значення буде надано елементу з відповідним індексом. Якщо підпис не буде вказано, індексом елемента, якому буде надано значення, буде індекс останнього елемента, якому було надано значення якоюсь інструкцією, плюс один. Нумерація елементів масиву починається з нуля.

При встановленні значень асоціативного масиву словами у складеній інструкції надання значення можуть бути або інструкції надання значень, для яких потрібен підпис елемента, або список слів, які буде оброблено як послідовність альтернативних ключів та значень: назва=( ключ1 значення1 ключ2 значення2 ...). Результат обробки цих слів буде таким самим, як для назва=( [ключ1]=значення1 [ключ2]=значення2 ...). Перше слово у списку визначає, як оброблятимуться інші слова; усі інструкції надання значень у списку мають належати до одного типу. Якщо використовуватимуться пари ключ/значення, ключі не можна пропускати, вони не можуть бути порожніми; останнє пропущене значення буде оброблено як порожній рядок.

Таку синтаксичну конструкцію також приймає вбудована команда declare. Значення окремих елементів масиву можна вказати за допомогою синтаксичної конструкції назва[підпис]=значення, впровадженої вище. При наданні значення в індексованому масиві, якщо параметру назва передано від'ємний індекс, для визначення індексу елемента це число буде додано до числа, яке на одиницю більше максимального індексу у масиві назва. Отже, від'ємні індекси відраховуватимуться від кінця масиву, а індекс -1 є індексом останнього елемента масиву.

Доступ до будь-якого елемента масиву можна отримати за допомогою синтаксичної конструкції ${назва[підпис]}. Фігурні дужки є обов'язковими для уникнення конфліктів з розгортанням шляхів до файлів. Якщо підписом є @ або *, слово буде розгорнуто до усіх елементів масиву назва. Ці два підписи працюють по-різному, лише якщо слово взято у подвійні лапки. Якщо слово взято у подвійні лапки, ${назва[*]} розгортається до одинарного слова зі значенням усіх елементів масиву, які відокремлено один від одного першим символом спеціальної змінної IFS, а ${назва[@]} розгортає кожен елемент масиву назва в окреме слово. Якщо у масиві немає елементів, ${назва[@]} розгортається у порожнє значення. Якщо всередині слова відбувається розгортання у подвійних лапках, результат розгортання першого параметра буде об'єднано із початковою частиною початкового слова, а розгортання останнього параметра буде об'єднано із останньою частиною початкового слова. Така процедура є подібною до розгортання спеціальних параметрів * і @ (див. Спеціальні параметри вище). ${#назва[підпис]} буде розгорнуто у довжину ${назва[підпис]}. Якщо значенням параметра підпис є * або @, результатом розгортання буде кількість елементів у масиві. Якщо результатом обчислення значення підпис, яке використано для посилання на елемент індексованого масиву, є від'ємне число, для визначення індексу елемента це число буде додано до числа, яке на одиницю більше максимального індексу у масиві. Отже, від'ємні індекси відраховуватимуться від кінця масиву, а індекс -1 є індексом останнього елемента масиву.

Посилання на змінну-масив без визначення підпису є еквівалентним до посилання на елемент масиву із підписом 0. Можна використовувати будь-які посилання на змінну-масив із коректним підписом. Якщо потрібно, bash автоматично створить відповідний масив.

Значення змінної-масиву вважається встановленим, якщо підпису змінної надано значення. Коректним значенням може бути і порожній рядок.

Можна отримати ключі (індекси) масиву, а також значення. ${!назва[@]} і ${!назва[*]} розгортаються до індексів, які призначено у змінній-масиві назва. Обробка у подвійних лапках є подібною до розгортання спеціальних параметрів @ і * у подвійних лапках.

Для знищення масивів використовують вбудовану команду unset. Команда unset назва[підпис] знищує елемент масиву з індексом підпис, як для індексованих, так і для асоційованих масивів. Від'ємні значення підписів буде оброблено в описаний вище спосіб. Скасування встановлення останнього елемента у змінній-масиві не скасовує встановлення змінної. Команда unset назва, де назва є назвою масиву, або unset назва[підпис], де значенням підпис є * або @, вилучає увесь масив.

При використанні назви змінної із підписом як аргументу команди, так само, як із unset, без використання синтаксису розгортання слів, описаного вище, аргумент підлягатиме розгортанню шляхів до файлів. Якщо розгортання шляхів до файлів є небажаним, аргумент слід взяти у лапки.

Вбудовані команди declare, local та readonly приймають параметр -a для визначення індексованого масиву та параметр -A для визначення асоціативного масиву. Якщо вказано обидва параметри, пріоритет має параметр -A. Вбудована команда read приймає параметр -a для призначення списку слів, які прочитано зі стандартного джерела вхідних даних, до масиву. Вбудовані команди set і declare показують значення масиву у спосіб, яким можна скористатися для встановлення значень нового масиву.

РОЗГОРТАННЯ

Розгортання буде виконано у рядку команди після того, як його буде поділено на слова. Передбачено виконання семи типів розгортання: розгортання у дужках, розгортання тильди, розгортання параметрів і змінних, заміна команд, арифметичні обчислення, поділ на слова та розгортання шляхів.

Порядок розгортань є таким: розгортання у дужках; розгортання тильди, розгортання параметрів і змінних, арифметичні обчислення і заміна команд (буде виконано зліва праворуч); поділ на слова і розгортання шляхів.

У системах, де передбачено відповідну підтримку, доступним є ще одне розгортання: заміна процесу. Це розгортання буде виконано одночасно із розгортанням тильди, розгортанням параметрів і змінних, арифметичними обчисленнями і заміною команд.

Після виконання цих розгортань символи лапок у початковому слові буде вилучено, якщо їх не було взято у лапки (вилучення лапок).

Збільшити кількість слів у розгортанні можуть лише розгортання у дужках, поділ на слова і розгортання шляху; інші розгортання розгортають одинарне слово у одинарне слово. Єдиним виключенням є розгортання "$@" та "${назва[@]}", а також, здебільшого, $* та ${назва[*]}, як це описано вище (див. ПАРАМЕТРИ).

Розгортання у дужках

Розгортання у дужках є механізмом, за яким може бути створено довільні рядки. Цей механізм подібний до розгортання шляхів, але породжені назви файлів можуть бути і назвами файлів, які не існують. Взірці, які буде оброблено розгортанням у дужках, складаються з необов'язкової вступної частини, за якою має бути вказано або послідовність відокремлених комами рядків, або послідовність виразів у парі фігурних дужок, яку завершує необов'язкова кінцева частина. Вступну частину буде дописано перед кожним рядком у фігурних дужках, а потім до кожного з результатів буде дописано кінцеву частину. Розгортання відбувається зліва праворуч.

Розгортання у дужках може бути вкладеним. Результати розгортання кожного рядка не упорядковуються; зберігається порядок зліва праворуч. Приклад: a{d,c,b}e буде розгорнуто у «ade ace abe».

Вираз послідовності має форму {x..y[..крок]}, де x і y є або цілими числами або одинарними символами, а крок, необов'язковий крок у послідовності, є цілим числом. Якщо вказано цілі числа, вираз розгортається до кожного цілого числа від x до y, включно. До вказаних цілих чисел можна дописати префікс 0, щоб усі елементи у послідовності мали однакову довжину. Якщо x або y починається з нуля, оболонка спробує примусово створити послідовність, елементи якої складатимуться з однакової кількості цифр, дописавши нуль там, де це потрібно. Якщо вказано символи, вираз буде розгорнуто до кожного символу, який лексикографічно потрапляє у діапазон від x до y, включно, з використанням типової локалі C. Зауважте, що x і y мають належати до одного типу. Якщо вказано крок, його буде використано як приріст між елементами послідовності. Типовим кроком є 1 або -1, відповідно до взаємного розташування кінців послідовності.

Розгортання у дужках виконується до будь-яких інших розгортань. У результатах буде збережено усі символи, які є спеціальними для інших розгортань. Розгортання є строго текстовим. Bash не виконує жодної синтаксичної обробки контексту розгортання або тексту у фігурних дужках.

Правильно форматоване розгортання у дужках має містити ненейтралізовані початкову і кінцеву фігурні дужки та принаймні одну ненейтралізовану кому або один коректний вираз послідовності. Усі розгортання у дужках із помилковим форматуванням буде оброблено буквально. { або , може бути нейтралізовано символом зворотної похилої риски для запобігання обробці цих символів як частини виразу у дужках. Щоб уникнути конфлікту із розгортанням параметрів, рядок ${ не є прийнятним для розгортання у дужках — він придушує розгортання у дужках, аж до кінцевої }.

Ця конструкція типово використовується як скорочення, якщо загальний префікс рядків, які має бути створено, є довшим, ніж у наведеному вище прикладі:

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. Якщо потрібна строга сумісність із sh, запускайте bash із параметром +B або вимкніть розгортання у дужках за допомогою параметра +B команди set (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).

Розгортання тильди

Якщо слово починається з ненейтралізованого символу тильди («~»), усі символи до першого ненейтралізованого символу похилої риски (або усі символи, якщо у слові немає ненейтралізованої похилої риски) вважатимуться тильда-префіксом. Якщо жоден із символів у тильда-префіксі не є нейтралізованим, символи у тильда-префіксі вважатимуться можливою назвою облікового запису. Якщо ця назва облікового запису є порожнім рядком, тильду буде замінено на значення параметра оболонки HOME. Якщо значення HOME не встановлено, тильду буде замінено на адресу домашнього каталогу користувача, від імені якого запущено оболонку. У всіх інших випадках тильда-префікс буде замінено домашнім каталогом, пов'язаним із вказаною назвою облікового запису.

Якщо тильда-префіксом є «~+», тильда-префікс буде замінено на значення змінної оболонки PWD. Якщо тильда-префіксом є «~-», замість нього буде підставлено значення змінної середовища OLDPWD, якщо його встановлено. Якщо символи, які йдуть за тильдою у тильда-префіксі складаються з числа N, із необов'язковим префіксом «+» або «-», тильда-префікс буде замінено на відповідний елемент зі стосу каталогів так, наче він є результатом виконання будованої команди dirs, викликаної із тильда-префіксом як аргументом. Якщо символи після тильди у тильда-префіксі складаються з числа без початкового «+» або «-», буде використано варіант із «+».

Якщо назва облікового запису для входу є некоректною або не вдасться виконати розгортання тильди, слово лишиться незмінним.

В усіх інструкціях із встановленням значення змінної буде виконано перевірку на ненейтралізовані тильда-префікси одразу після : або першого =. Якщо такі префікси буде виявлено, також буде виконано розгортання тильди. Отже, можна використовувати назви файлів з тильдами у командах зі встановленням значень для PATH, MAILPATH та CDPATH оболонка надасть змінній розгорнуте значення.

Крім того, bash виконує розгортання тильди у словах, які відповідають умовам надання змінним значення (як це описано вище у розділі ПАРАМЕТРИ), коли вони з'являються як аргументи у простих командах. У режимі posix bash цього не робитиме, окрім описаних вище команд оголошення.

Розгортання параметрів

Символ «$» впроваджує розгортання параметрів, заміну команд або арифметичні обчислення. Назви параметрів або символів, які слід розгорнути, може бути взято у фігурні дужки, які є необов'язковим, але слугують для захисту змінної від розгортання змінної за символами, які вказано після її назви і які може бути оброблено як частину назви.

Якщо використано фігурні дужки, відповідною завершальною дужкою вважатиметься перша «}», яку не екрановано символом зворотної похилої риски і яка не є частиною нейтралізованого рядка, і не перебуває у вбудованому арифметичному виразі, заміні команди або розгортанні параметра.

${параметр}
Буде підставлено значення параметра. Якщо параметр є позиційним параметром, номер якого складається з декількох цифр, або якщо після параметра вказано символ, який не слід обробляти як частину його назви, слід скористатися фігурними дужками. Параметр має бути параметром оболонки, який описано вище (див. ПАРАМЕТРИ) або посиланням на масив (Масиви).

Якщо першим символом параметра є знак оклику (!) і параметр не належить до типу nameref, він впроваджує рівень опосередкованості. Bash використовує значення, яке сформовано розгортанням решти параметра як новий параметр; далі, розгортає цей параметр і використовує значення у решті розгортання замість розгортання початкового параметра. Цей процес відомий як опосередковане розгортання. Отримане значення підлягає розгортанню тильди, розгортанню параметрів, заміні команд та арифметичним обчисленням. Якщо параметр належить до типу nameref, розгортання дає назву параметра, на який посилається параметр, а не повне опосередковане розгортання. Виключеннями з цього правила є розгортання ${!префікс*} та ${!назва[@]}, які описано нижче. Щоб було впроваджено опосередковане розгортання, після знаку оклику має бути одразу вказано ліву фігурну дужку.

В усіх наведених нижче випадках слово підлягатиме розгортанню тильди, розгортанню параметрів, заміні команд та арифметичним обчисленням.

Якщо не виконуватиметься розгортання підрядків, з використанням документованих нижче форм (наприклад, :-), bash виконує перевірку того, чи є параметр невстановленим або порожнім. Якщо не буде використано двокрапку, виконуватиметься перевірка лише на те, чи є параметр невстановленим.

${параметр:-слово}
Використовувати типові значення. Якщо значення параметра не буде встановлено або воно буде порожнім, буде підставлено розгортання слова. У інших випадках буде підставлено значення параметра.
${параметр:=слово}
Призначити типові значення. Якщо значення параметра не встановлено або його значення є порожнім, для параметра буде встановлено значення слово. Після цього параметр буде замінено на значення параметра. У такий спосіб не можна встановлювати значення для позиційних і спеціальних параметрів.
${параметр:?слово}
Показ помилки, якщо порожній або не встановлено. Якщо параметр має порожнє значення або його значення не встановлено, розгортання слова (або повідомлення щодо цього ефекту, якщо слова немає) буде записано до стандартного потоку помилок, і оболонка, якщо вона не є інтерактивною, завершить роботу. В усіх інших випадках буде підставлено параметр.
${параметр:+слово}
Використати альтернативне значення. Якщо параметр має порожнє значення або значення параметра не встановлено, підставляння не виконуватиметься. В усіх інших випадках буде підставлено розгортання слова.
${параметр:відступ}
${параметр:відступ:довжина}
Розгортання підрядка. Буде розгорнуто до довжина символів значення параметр, починаючи з символу, який вказано значенням відступ. Якщо параметром є @, індексований масив із підписом @ або * або назва асоціативного масиву, результат буде іншим, описаним нижче. Якщо довжину не вказано, буде виконано розгортання до підрядка значення параметра, що починається з символу, вказаного аргументом відступ, і продовжується до кінця значення. Значення довжина і відступ є арифметичними виразами (див. АРИФМЕТИЧНІ ОБЧИСЛЕННЯ нижче).

Якщо обчисленим значенням відступу є від'ємне число, значення буде використано як відступ у символах з кінця значення параметра. Якщо обчисленим значенням довжини є від'ємне число, його буде використано як відступ у символах від кінця значення параметра, а не кількість символів, а результатом розгортання будуть символи між значенням відступу і обчисленим значенням довжини. Зауважте, що від'ємний відступ має бути відокремлено від двокрапки принаймні одним пробілом, щоб його не можна було сплутати з розгортанням :-.

Якщо параметром є @, результатом буде довжина позиційних параметрів, починаючи з параметра відступ. Від'ємні значення відступу буде відраховано від значення на одиницю більшого за найбільший позиційний параметр. Отже, відступ -1 визначає останній позиційний параметр. Якщо обчисленим значенням аргументу довжина є від'ємне значення, програма повідомить про помилку розгортання.

Якщо параметром є назва індексованого масиву із підписом @ або *, результатом буде довжина елементів масиву, починаючи з ${параметр[відступ]}. Від'ємні значення аргументу відступ буде відраховано від номера, який на одиницю більший за максимальний індекс у вказаному масиві. Якщо обчисленим значенням аргументу довжина є від'ємне значення, програма повідомить про помилку розгортання.

Застосоване до асоціативного масиву розгортання підрядків дає невизначені результати.

Відлік елементів у підрядках ведеться від нуля, якщо не використано позиційних параметрів. У випадку використання позиційних параметрів, типово, індексування починається з 1. Якщо відступ дорівнює 0 і використано позиційні параметри, до списку буде дописано префікс $0.

${!префікс*}
${!префікс@}
Префікс відповідності назв. Буде розгорнуто до назв змінних, чиї назви починаються з префікса. Записи назви буде відокремлено першим символом спеціальної змінної IFS. Якщо використано @ і розгортання відбувається у подвійних лапках, кожну назву змінної буде розгорнуто в окреме слово.
${!назва[@]}
${!назва[*]}
Список ключів масиву. Якщо назва є змінною-масивом, буде розгорнуто до списку індексів (ключів) масиву, яким надано значення у масиві назва. Якщо назва не є масивом, буде розгорнуто у 0, якщо значення назва встановлено, і порожнє значення, якщо ні. Якщо використано @ і розгортання відбувається у подвійних лапках, кожен ключ буде розгорнуто до окремого слова.
${#параметр}
Довжина параметра. Буде замінено на довжину значення параметра у символах. Якщо параметром є * або @, буде замінено кількістю позиційних параметрів. Якщо параметром є назва масиву із підписом * або @, буде замінено на кількість елементів у масиві. Якщо параметр є назвою індексованого масиву із підписом — від'ємним числом, це число відраховуватиметься від більшого на одиницю за максимальний індекс параметра числа. Отже від'ємні індекси відраховуються від кінця масиву, а індекс -1 відповідає останньому елементу масиву.
${параметр#слово}
${параметр##слово}
Вилучення префікса за взірцем. Слово буде розгорнуто для отримання взірця, як у розгортанні шляхів. Отриманий взірець буде використано для обробки розгорнутого значення параметра з використанням правил, які описано у розділі Відповідність за взірцем нижче. Якщо взірець відповідатиме початку значення параметра, результатом розгортання буде розгорнуте значення параметра, з якого вилучено найкоротший відповідний взірець (випадок «#») або найдовший відповідний взірець (випадок «##»). Якщо параметром є @ або *, дію з вилучення взірця буде застосовано до кожного позиційного параметра послідовно, і результатом розгортання буде список. Якщо параметром є змінна-масив із підписом @ або *, дію з вилучення взірця буде застосовано до кожного елемента масиву послідовно, а результатом розгортання буде отриманий список.
${параметр%слово}
${параметр%%слово}
Вилучення суфікса за взірцем. Слово буде розгорнуто для отримання взірця, як у розгортанні шляхів. Отриманий взірець буде використано для обробки розгорнутого значення параметра з використанням правил, які описано у розділі Відповідність за взірцем нижче. Якщо взірець відповідатиме завершенню значення параметра, результатом розгортання буде розгорнуте значення параметра, з якого вилучено найкоротший відповідний взірець (випадок «%») або найдовший відповідний взірець (випадок «%%»). Якщо параметром є @ або *, дію з вилучення взірця буде застосовано до кожного позиційного параметра послідовно, і результатом розгортання буде список. Якщо параметром є змінна-масив із підписом @ або *, дію з вилучення взірця буде застосовано до кожного елемента масиву послідовно, а результатом розгортання буде отриманий список.
${параметр/взірець/рядок}
Заміна за взірцем. Взірець буде розгорнуто у взірець, як у розгортанні шляхів. Буде розгорнуто параметр і замінено найдовший відповідник взірця у значенні на рядок. Відповідність буде встановлено за правилами, які описано у розділі Відповідність за взірцем нижче. Якщо взірець починатиметься з /, усі відповідники взірця буде замінено на рядок. Зазвичай, замінено буде лише перший відповідник. Якщо взірець починається з #, відповідність має бути встановлено з початком розгорнутого значення параметра. Якщо взірець починається з %, відповідність має бути встановлено наприкінці розгорнутого значення параметра. Якщо рядок є порожнім, відповідники взірця буде вилучено, і / після взірця можна пропустити. Якщо увімкнено параметр оболонки nocasematch, відповідність буде встановлено без врахування регістру абеткових символів. Якщо параметром є @ або *, дію із заміни буде застосовано до кожного позиційного параметра послідовно, а результатом розгортання буде оброблений список. Якщо параметром є змінна-масив із підписом @ або *, дію із заміни буде застосовано до кожного елемента у масиві послідовно, а результатом розгортання буде оброблений список.
${параметр^взірець}
${параметр^^взірець}
${параметр,взірець}
${параметр,,взірець}
Зміна регістру. Це розгортання змінює регістр абеткових символів у параметрі. Взірець буде розгорнуто до взірця, як у розгортанні шляхів. Кожен із символів у розгорнутому значенні параметра буде порівняно із взірцем і, якщо він відповідає взірцю, його регістр буде змінено. Взірець має описувати точно один символ. Оператор ^ призведе до перетворення літер нижнього регістру, які відповідають взірцю, на літери верхнього регістру; оператор , призведе до перетворення відповідних літери верхнього регістру на літери нижнього регістру. Розгортання ^^ і ,, призведуть до перетворення усіх відповідних символів у розгорнутому значення; розгортання ^ і , призведуть до перетворення лише першого символу у розгорнутому значенні. Якщо взірець вказано не буде, замість нього буде використано ?, тобто взірець довільного символу. Якщо параметром є @ або *, дію зі зміни регістру буде застосовано до кожного позиційного параметра послідовно, а результатом розгортання буде оброблений список. Якщо параметром є змінна-масив із підписом @ або *, дію зі зміни регістру буде застосовано до кожного елемента у масиві послідовно, а результатом розгортання буде оброблений список.
${параметр@оператор}
Перетворення параметрів. Розгортанням буде або перетворення значення параметра або відомості щодо самого параметра, залежно від значення оператора. Усі оператори складаються з однієї літери:
Результатом розгортання є рядок, який є значенням параметра, у якому літери нижнього регістру (малі) замінено на відповідні їм літери верхнього регістру (великі).
Результатом розгортання є рядок, який є значенням параметра, у якому перший символ буде замінено на відповідну літеру верхнього регістру (велику), якщо перший символ є літерою.
Результатом розгортання є рядок, який є значенням параметра, у якому літери верхнього регістру (великі) замінено на відповідні їм літери нижнього регістру (малі).
Результатом розгортання є рядок, який є значенням параметра, у якому вміст нейтралізовано до формату, який можна використати як вхідні дані.
Результатом розгортання є рядок, який є значенням параметра, у якому екрановані послідовності із символом зворотної похилої риски буде розгорнуто так, як у механізмі нейтралізації $'...'.
Результатом розгортання є рядок, який є розгортанням параметра у такий спосіб, наче він є рядком запиту (див. ЗАПИТИ нижче).
Розгортанням є рядок у формі інструкції зі встановлення значення або команди declare, яка, якщо її виконати, повторно створить параметр з його атрибутами і значенням.
Дає, можливо, нейтралізовану версію значення параметра, але виводить значення індексованих або асоціативних масивів як послідовність нейтралізованих пар ключ-значення (див. Масиви вище).
Розгортанням буде рядок, що складається зі значень прапорців, що відповідають атрибутам параметра.

Якщо параметром є @ або *, дію буде застосовано до кожного позиційного параметра послідовно, а результатом розгортання буде оброблений список. Якщо параметром є змінна-масив із підписом @ або *, дію буде застосовано до кожного елемента у масиві послідовно, а результатом розгортання буде оброблений список.

Результат розгортання розгортання буде поділено на слова і застосовано до нього розгортання шляхів у описаний нижче спосіб.

Заміна команд

Заміна команд уможливлює заміну назви команди на результат її виконання. Передбачено дві форми:

$(команда)

або
`команда`

Bash виконує розгортання, виконавши команду у середовищі підоболонки і замінивши команду на стандартне виведення команди із вилученням усіх кінцевих символів нового рядка. Вбудовані нові рядки не буде вилучено, але їх може бути вилучено під час поділу на слова. Заміну команди $(cat файл) може бути замінено еквівалентним, але швидшим, $(< файл).

Якщо використано стару форму заміни із використанням зворотного апострофа, зворотний апостроф зберігає своє буквальне значення, якщо після нього не вказано $, ` або \. Перший зворотний апостроф, перед яким немає символу зворотної похилої риски, завершує заміну команди. Якщо використано форму $(команда), усі символи у дужках складають команду; жоден з цих символів не підлягатиме особливій обробці.

Заміна команд може бути вкладеною. Для створення вкладеності у формі зі зворотним апострофом екрануйте внутрішні зворотні апострофи символами зворотних похилих рисок.

Якщо заміну взято у подвійні лапки, до результатів не буде застосовано поділ на слова та розгортання шляхів.

Арифметичні обчислення

За допомогою арифметичних обчислень можна визначати значення арифметичного виразу і підставляти до команди результат. Формат арифметичних обчислень є таким:

$((вираз))

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

Обчислення буде виконано відповідно до наведених нижче у розділі АРИФМЕТИЧНІ ОБЧИСЛЕННЯ правил. Якщо вираз є некоректним, bash виведе повідомлення, що вказуватиме на помилку і не виконуватиме підставляння результату обчислень.

Заміна процесу

За допомогою заміни процесів можна посилатися на вхідні і вихідні канали процесів, як на назви файлів. Заміну процесів записують у формі <(список) або >(список). Список процесів буде запущено асинхронно, а якого вхідний і вихідний канали стануть доступними через назву файла. У результаті заміни, цю назву файла буде передано як аргумент поточній команді. Якщо використано форму >(список), запис до файла буде вхідним каналом для списку. Якщо використано форму <(список), слід буде виконати читання файла, переданого як аргумент, щоб отримати доступ до вихідного каналу списку. Підтримку заміни процесу передбачено у системах, у яких є підтримка іменованих каналів (FIFO) або методу /dev/fd іменування відкритих файлів.

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

Поділ на слова

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

Оболонка вважає кожен символ IFS роздільником і ділить результати інших розгортань на слова із використанням цих символів як меж полів. Якщо значення IFS не встановлено, або його значенням є точно <space><tab><newline>, типове значення, послідовності <space>, <tab> і <newline> на початку або наприкінці результатів попередніх розгортань буде проігноровано, а будь-які послідовності символів IFS не на початку і не у кінці будуть слугувати як межі слів. Якщо IFS має нетипове значення, послідовності символів-пропусків space, tab і newline буде проігноровано на початку і наприкінці слова, якщо символ пропуску є у значенні IFS (символ-пропуск IFS). Будь-який символ в IFS, який не є пропуском IFS, разом із будь-якими сусідніми символами-пропусками IFS, відмежовує поле. Послідовність символів-пропусків IFS також вважатиметься межею. Якщо значення IFS є порожнім, поділ на слова не відбуватиметься.

Явні порожні аргументи ("" or '') буде збережено і передано команди як порожні рядки. Ненейтралізовані неявні порожні аргументи, які є результатом розгортання параметрів, які не мають значень, буде вилучено. Якщо параметр без значення буде розгорнуто у подвійних лапках, буде отримано порожній аргумент; його буде збережено і передано команді як порожній рядок. Якщо нейтралізований порожній аргумент буде частиною слова, чиє розгортання не є порожнім, порожній аргумент буде вилучено. Таким чином, слово -d'' дасть -d після поділу на слова і вилучення порожніх аргументів.

Зауважте, що якщо розгортання не відбуватиметься, поділ на слова також не відбуватиметься.

Розгортання шляхів

Після поділу на слова, якщо не встановлено параметра -f, bash виконує пошук у кожному зі слів символів *, ? і [. Якщо буде виявлено один із цих символів, і його не нейтралізовано, слово вважатиметься взірцем — його буде замінено на упорядкований за абеткою список назв файлів, які відповідають взірцю (див. Відповідність за взірцем нижче). Якщо відповідних назв файлів знайдено не буде, і не увімкнено параметр оболонки nullglob, слово буде вставлено до команди без змін. Якщо встановлено параметр nullglob, і не знайдено жодного відповідника, слово буде вилучено. Якщо встановлено параметр failglob, і не знайдено відповідників, буде виведено повідомлення про помилку, а команду не буде виконано. Якщо увімкнено параметр оболонки nocaseglob, відповідність встановлюватиметься без врахування регістру абеткових символів. Якщо взірець використано для розгортання шляхів, символ на початку “.” назви або одразу після символу похилої риски має відповідати рядку явно, якщо не встановлено параметр оболонки dotglob. Назви файлів “.” і “..” мають бути завжди відповідати точно, навіть якщо встановлено dotglob. В інших випадках символ “.” оброблятиметься у звичний спосіб. При встановленні відповідності шляхів символ похилої риски має бути відповідним явним чином похилій рисці у взірці, але в інших контекстах відповідності він може бути відповідним спеціальним символом взірця, як описано нижче у розділі Відповідність за взірцем. Див. опис shopt нижче у розділі ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ, щоб ознайомитися із описом параметрів оболонки nocaseglob, nullglob, failglob і dotglob.

Для обмеження набору назв файлів, які відповідають взірцю, можна скористатися змінною оболонки GLOBIGNORE. Якщо встановлено змінну GLOBIGNORE, усі відповідні назви файлів, які також відповідають одному із взірців у GLOBIGNORE буде вилучено зі списку відповідників. Якщо встановлено параметр nocaseglob, відповідність взірцям у GLOBIGNORE встановлюватиметься без врахування регістру символів. Назви файлів “.” і “..” буде завжди проігноровано, якщо встановлено непорожнє значення GLOBIGNORE. Втім, встановлення непорожнього значення GLOBIGNORE призведе до вмикання параметри оболонки dotglob, отже, відповідними вважатимуться усі інші назви файлів, що починаються з “.”. Щоб отримати стару поведінку з ігноруванням назв файлів, що починаються з “.”, зробіть “.*” одним із взірців у GLOBIGNORE. Параметр dotglob буде вимкнено, якщо не встановлено значення GLOBIGNORE. При встановленні відповідності взірцю буде взято до уваги значення параметра оболонки extglob.

Відповідність за взірцем

Будь-який символ, який з’являється у взірці, окрім спеціальних символів взірця, описаних нижче, збігається сам із собою. Символ NUL може не зустрічатися у взірці. Зворотна похила риска екранує наступний символ; при збігу зворотна похила риска відкидається. Спеціальні символи взірця слід уводити в лапках, якщо вони мають відповідати буквально.

Спеціальні символи взірців мають таке значення:

*
Збігається з будь-яким рядком, включаючи нульовий (null) рядок. Якщо увімкнено параметр оболонки globstar і в контексті розширення назви шляху використовується *, дві * поруч, використані як єдиний взірець, відповідатимуть усім файлам і нулю або більше каталогів і підкаталогів. Якщо далі йде /, дві * поруч відповідатимуть лише каталогам і підкаталогам.
?
Відповідає будь-якому одинарному символу.
[...]
Відповідає будь-якому зі вкладених символів. Пара символів, розділених дефісом, позначає вираз діапазону; відповідає будь-якому символу, що міститься між цими двома символами включно, з використанням послідовності порівняння поточної локалі та набору символів. Якщо першим після [ є символ ! або ^, то відповідає будь-якому не вкладеному символу. Порядок сортування символів у виразі діапазону визначається поточним мовним стандартом і значеннями змінних оболонки LC_COLLATE або LC_ALL, якщо їх встановлено. Для отримання традиційної інтерпретації виразів діапазону, де [a-d] еквівалентне [abcd], встановіть для змінної оболонки LC_ALL значення C, або увімкніть параметр оболонки globasciiranges. - можна увідповіднити, включивши його в набір як перший або останній символ. ] можна увідповіднити, включивши в набір як перший символ.

Між [ і ] можна вказувати класи символів у формі такої синтаксичної конструкції: [:клас:], де клас є одним із вказаних нижче класів, які визначено у стандарті POSIX:

alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Клас символів відповідає будь-якому символу, що належить класу. Клас символів word відповідає літерам, цифрам та символам _.

Між [ і ] можна задати клас еквівалентності, скориставшись синтаксисом [=c=], який відповідає всім символам з такою ж вагою зіставлення (як визначено поточним мовним стандартом), що й символ c.

Між [ і ], синтаксису [.символ.] відповідає символ зіставлення символ.

Якщо параметр оболонки extglob увімкнено за допомогою вбудованої команди shopt, розпізнається кілька розширених операторів відповідності взірцю. В подальшому описі список_взірців - це список із одного або кількох взірців, розділених символом |. Складені взірці можна сформувати за допомогою одного або кількох із таких підвзірців:

?(список_взірвців)
Відповідає нульовій або одинарній кількості відповідників вказаних взірців
*(список_взірвців)
Відповідає нулю, одному або декільком збігам із заданим взірцем
+(список_взірців)
Відповідає одному або декільком збігам із заданим взірцем
@(списо_взірців)
Відповідає одному з заданих взірців
!(список_взірців)
Відповідає усьому, окрім одного з заданих взірців

Зіставлення складних розширених взірців із довгими рядками виконується повільно, особливо коли взірці містять чергування, а рядки містять кілька збігів. Використання окремих збігів для коротших рядків або використання масивів рядків замість одного довгого рядка може бути швидшим.

Вилучення лапок

Після попередніх розгортань усі ненейтралізовані послідовності символів \, ' і ", які не були результатом вказаних вище розгортань, буде вилучено.

ПЕРЕСПРЯМОВУВАННЯ

Перш ніж команду буде виконано, її вхід і вихід може бути переспрямовано за допомогою спеціальних позначень, які обробляє оболонка. За допомогою переспрямувань можна дублювати, відкривати, закривати, замінювати на посилання на інші файли дескриптори файлів команди, а також змінювати файли, з яких програма читатиме дані і до яких вона записуватиме дані. Також переспрямуваннями можна скористатися для внесення змін до дескрипторів файлів у поточному середовищі виконання оболонки. Описані нижче оператори переспрямовування можуть передувати простій команді, бути розташованими у ній або слідувати за командою. Переспрямування буде оброблено у вказаному у команді порядку, зліва праворуч.

Перед кожним переспрямуванням, перед яким можна вказати номер дескриптора файла, можна також вказати слово у формі {назва-змінної}. У таких випадках, для кожного оператора переспрямування, окрім >&- і <&-, оболонка розмістить у пам'яті дескриптор файла із номером, що перевищує 9, і встановить для нього значення назва-змінної. Якщо перед >&- або <&- буде вказано {назва-змінної}, значення назва-змінної визначить дескриптор файла, який слід закрити. Якщо вказано аргумент {назва-змінної}, переспрямування працюватиме за областю дії команди, що надає змогу програмісту оболонки керувати самим дескриптором файла.

У наведених нижче описах, якщо не вказано номера дескриптора файла, і першим символом оператора переспрямування є <, переспрямування буде виконано зі із стандартного джерела вхідних даних (файлом із дескриптором 0). Якщо першим символом оператора переспрямування є >, переспрямування буде виконано до стандартного виведення (файла із дескриптором 1).

Слово, яке слідує за оператором переспрямування у наведених нижче описах, якщо окремо не написано іншого, підлягає розгортанню у дужках, розгортанню тильди, розгортанню параметрів та змінних, заміні команд, арифметичним обчисленням, вилученню нейтралізації, розгортанню шляхів та поділу на слова. Якщо у результаті розгортання буде отримано декілька слів, bash повідомить про помилку.

Зауважте, що порядок переспрямувань має значення. Наприклад, команда

ls > dirlist 2>&1

спрямовує стандартне виведення та стандартне виведення помилок до файла dirlist, а команда

ls 2>&1 > dirlist

спрямовує лише стандартне виведення до файла dirlist, оскільки стандартне виведення помилок було дубльовано зі стандартного виведення до того, як стандартне виведення було переспрямовано до файла dirlist.

Деякі назви файлів при використанні переспрямувань bash обробляє по-особливому, так, як це описано у наведеній нижче таблиці. Якщо операційна система, у якій запущено bash, надає доступ до цих спеціальних файлів, bash скористається ними. Якщо ні, bash емулюватиме їх на внутрішньому рівні, скориставшись поведінкою, яку описано нижче.

/dev/fd/дескриптор_файла
Якщо дескриптор_файла є коректним цілим числом, буде здубльовано дескриптор файла дескриптор_файла.
/dev/stdin
Буде здубльовано дескриптор файла 0.
/dev/stdout
Буде здубльовано дескриптор файла 1.
/dev/stderr
Буде здубльовано дескриптор файла 2.
/dev/tcp/вузол/порт
Якщо вузол є коректною назвою вузла або інтернет-адресою, і порт є цілим числом — номером порту або назвою служби, bash спробує відкрити відповідний сокет TCP.
/dev/udp/вузол/порт
Якщо вузол є коректною назвою вузла або інтернет-адресою, і порт є цілим числом — номером порту або назвою служби, bash спробує відкрити відповідний сокет UDP.

Неможливість відкрити або створити файл спричиняє помилку переспрямовування.

Переспрямовуванням із використанням дескрипторів файлів, номер яких перевищує 9, слід користуватися із обережністю, оскільки вони можуть конфліктувати із дескрипторами, які оболонка використовує на внутрішньому рівні.

Переспрямування введення

Переспрямування вхідних даних призведе до того, що файл, назва якого є результатом розгортання слова, буде відкрито для читання на дескрипторі файла n або на стандартному введенні (файла з дескриптором 0), якщо n не вказано.

Загальний формат для переспрямування вводу такий:

[n]<слово

Переспрямування виведення

Переспрямування виведених даних призведе до того, що файл, назва якого є результатом розгортання слова, буде відкрито для читання на дескрипторі файла n або на стандартному виведенні (файла з дескриптором 1), якщо n не вказано. Якщо файла не існує, його буде створено; якщо він існує, його буде обрізано до нульового розміру.

Загальний формат для переспрямування виводу такий:

[n]>слово

Якщо оператором переспрямування є > і було увімкнено параметр noclobber вбудованої команди set, спроба переспрямовування завершиться помилкою, якщо файл, назву якого буде визначено шляхом розгортання слова, існує і є звичайним файлом. Якщо оператором переспрямування є >| або оператором переспрямування є > і не увімкнено параметр noclobber у вбудованій команді set, буде виконано спробу пересрямовування, навіть якщо файл із назвою, яку отримано розгортанням слова, існує.

Дописування переспрямованого виведення

Переспрямування виведення у цей спосіб призведе до того, що файл, назва якого є результатом розгортання слова, буде відкрито для дописування на дескрипторі файла n або на стандартному виведенні (файла з дескриптором 1), якщо n не вказано. Якщо файла не існує, його буде створено.

Загальним форматом для дописування виведення є такий:

[n]>>слово

Переспрямування стандартного виводу та стандартних помилок

Ця конструкція уможливлює переспрямовування і стандартного виведення (дескриптор файла 1), і стандартного виведення помилок (дескриптор файла 2) до файла, чиєю назвою є розгортання слова слово.

Існує два формати переспрямування стандартного виводу та стандартних помилок:

&>слово

і
>&слово

З двох форм пріоритетною є перша. Семантично це еквівалентно до

>слово 2>&1

Якщо використано другу форму, слово не зможе розгорнутися до числа або -. Якщо воно розгортається, з міркувань сумісності застосовуються інші оператори переспрямовування (див. Дублювання дескрипторів файлів).

Дописування стандартного виводу та стандартних помилок

Ця конструкція уможливлює дописування і стандартного виведення (дескриптор файла 1), і стандартного виведення помилок (дескриптор файла 2) до файла, чиєю назвою є розгортання слова слово.

Форматуванням для дописування стандартного виведення і стандартного виведення помилок є таке форматування:

&>>слово

Семантично це еквівалентно до

>>слово 2>&1

(див. Дублювання дескрипторів файлів нижче).

Контекстні документи

Цей тип переспрямовування вказує оболонці, що слід прочитати вхідні дані з поточного джерела, аж до рядка, що містить лише роздільник (без кінцевих пропусків). Згодом, як стандартне джерело вхідних даних (або дескриптор файла n, якщо вказано n) для команди буде використано усі рядки аж до цієї позиції.

Формат контекстних документів:

[n]<<[-]слово

контекстний документ роздільник

У слові слово не буде виконано розгортання параметрів і змінних, заміни команд, арифметичних обчислень та розгортання шляхів. Якщо якусь частину слова слово взято у лапки, роздільником буде результат вилучення лапок зі слова, а рядки контекстного документа не розгортатимуться. Якщо слово не буде взято у лапки, в усіх рядках контекстного документа виконуватиметься розгортання параметрів, заміни команд та арифметичні обчислення, послідовність символів \<новий рядок> буде проігноровано, а для нейтралізації символів \, $ і ` слід використовувати \.

Якщо оператором переспрямовування є <<-, з вхідних рядків буде прибрано початкові табуляції та рядки, що містять роздільник. Це уможливлює належні відступи у рядках контекстного документа у скриптах оболонки.

Контекстні рядки

Варіант контекстних документів. Форматування:

[n]<<<слово

Слово підлягає розгортанню тильди, розгортанню параметрів і змінних, заміні команд, арифметичним обчисленням та вилученню нейтралізації. Розгортання шляхів і поділ на слова не виконуватимуться. Результат буде надано як єдиний рядок із додаванням наприкінці символу нового рядка до команди у її стандартне джерело вхідних даних (або у файл з дескриптором n, якщо вказано n).

Дублювання дескрипторів файлів

Оператор переспрямовування

[n]<&слово

використовують для дублювання дескрипторів файлів вхідних даних. Якщо слово розгортається до однієї або декількох цифр, дескриптор файла із позначенням n стане копією цього дескриптора файла. Якщо цифри у слові не задають дескриптор файла, який відкрито для введення даних, станеться помилка переспрямування. Якщо обчисленим значенням слова є -, дескриптор файла n буде закрито. Якщо n не вказано, буде використано стандартне джерело вхідних даних (файл із дескриптором 0).

Оператор

[n]>&слово

використовують у подібний спосіб для дублювання дескрипторів файлів виведення. Якщо не вказано n, буде використано стандартне виведення (файл із дескриптором 1). Якщо цифри у слові не задають дескриптора файла, який відкрито для виведення, станеться помилка переспрямування. Якщо обчисленим значенням слова є -, файл із дескриптором n буде закрито. У особливому випадку, якщо не вказано n, і розгортанням слова не є одна або декілька цифр або -, стандартне виведення і стандартне виведення помилок буде переспрямовано у описаний раніше спосіб.

Пересування дескрипторів файлів

Оператор переспрямовування

[n]<&цифра-

пересуває дескриптор файла цифра до дескриптора файла n або стандартного джерела вхідних даних (дескриптор файла 0), якщо n не вказано. цифра буде закрито після дублювання до n.

Так само, оператор переспрямовування

[n]>&цифра-

пересуває дескриптор файла цифра до дескриптора файла n або стандартного виведення (дескриптор файла), якщо n не вказано.

Відкриття дескрипторів файлів для читання і запису

Оператор переспрямовування

[n]<>слово

спричиняє відкриття файла, чия назва визначається розгортанням слова слово, для читання і запису на дескрипторі файла n або відкриття дескриптора файла 0, якщо n не вказано. Якщо файла не існує, його буде створено.

АЛЬТЕРНАТИВИ

За допомогою альтернатив можна замінити рядок на слово, якщо рядок використано як перше слово простої команди. В оболонці передбачено список альтернатив, які можна встановити або скасувати за допомогою вбудованих команд alias і unalias (див. ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче). Перше слово кожної простої команди, якщо його не нейтралізовано, буде перевірено на належність до альтернатив. Якщо буде виявлено, що слово є альтернативою, це слово буде замінено на текст альтернативи. У назві альтернативи не можна використовувати символи /, $, ` та =, а також будь-які метасимволи або оболонки або символи нейтралізації, список яких наведено вище. Текст заміни може містити будь-які коректні вхідні дані оболонки, зокрема метасимволи оболонки. Перше слово тексту заміни буде перевірено на належність до альтернатив, але слово, яке збігається із альтернативою, яка розгортається, не буде розгорнуто вдруге. Це означає, що можна, наприклад, використати альтернативу ls для ls -F, і bash не намагатиметься рекурсивно розгортати текст заміни. Якщо останній символ значення альтернативи є пропуском, наступне слово команди за альтернативою також буде перевірено на можливість розгортання альтернативи.

Альтернативи можна створити або переглянути за допомогою команди alias. Вилучити альтернативи можна за допомогою команди unalias.

Механізму використання аргументів у тексті заміни не передбачено. Якщо потрібні аргументи, слід скористатися функцією оболонки (див. ФУНКЦІЇ нижче).

Розгортання альтернатив не виконуватиметься для неінтерактивної оболонки, якщо не встановлено параметра оболонки expand_aliases за допомогою shopt (див. опис shopt у розділі ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче).

Правила, які стосуються визначення і використання альтернатив, є дещо заплутаними. Bash завжди читає принаймні один повний рядок вхідних даних і усі рядки, з яких складається складена команда, перш ніж виконувати будь-яку команду у цьому рядку або складену команду. При читанні, а не при виконанні, команди альтернативи буде розгорнуто. Тому визначення альтернативи у тому самому рядку, що і інша команда, не працюватиме до читання наступного рядка вхідних даних. Нові альтернативи не буде використано у командах, які слідують за визначенням альтернативи в одному рядку. Така поведінка може також стати проблемою при виконанні функцій. Розгортання альтернатив відбуватиметься при читанні визначення функцій, а не при виконанні функцій, оскільки визначення функції саме є командою. Як наслідок, альтернативи, які визначено у функції, є недоступними до виконання цієї функції. Щоб уникнути проблем, завжди визначайте альтернативи в окремому рядку і не використовуйте alias у складених командах.

Майже усюди альтернативи можна замінити функціями оболонки.

ФУНКЦІЇ

У функції оболонки, яку визначено у описаний вище у розділі ГРАМАТИКА ОБОЛОНКИ спосіб, зберігається послідовність команд, яку можна будь-коли виконати. Якщо використати назву функції як назву простої команди, буде виконано список команд, які пов'язано із цією функцією. Функції буде виконано у контексті поточної оболонки; система не створюватиме процес для їхньої обробки (на відміну від виконання скрипту оболонки). Під час виконання функції аргументами будуть позиційні параметра на момент виконання. Для відтворення зміни буде оновлено спеціальний параметр #. Спеціальний параметр 0 лишиться незмінним. Для першого елемента змінної FUNCNAME на час виконання функції буде встановлено значення назви функції.

Усі інші аспекти середовища виконання оболонки є однаковими для функції і скрипту, з якого її викликано, із такими винятками: пастки DEBUG і RETURN (див. опис вбудованої команди trap у розділі ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ нижче) не буде успадковано, якщо функції не передано атрибут trace (див. опис вбудованої команди declare нижче) або не буде увімкнено параметр оболонки -o functrace за допомогою вбудованої команди set (у цьому випадку усі функції успадкують пастки DEBUG і RETURN), а пастку ERR не буде успадковано, якщо не увімкнено параметр оболонки -o errtrace.

Локальні щодо функції змінні може бути оголошено за допомогою вбудованої команди local. Зазвичай, змінні і їхні значення є спільними для функції і місця, звідки її викликають. Якщо змінну оголошено як local, область видимості змінної буде обмежено функцією і її дочірніми об'єктами (включно із функціями, які вона викликає). Локальні змінні «затіняють» змінні із тими самими назвами, які оголошено у попередніх областях видимості. Наприклад, локальна змінна, яку оголошено у функції, приховує загальну змінну із тією самою назвою: посилання та встановлення значень стосуватимуться локальної змінної, а загальна змінна лишиться незмінною. При поверненні з функції загальна змінна знову стає видимою.

Оболонка використовує динамічне визначення областей видимості для керування видимістю змінних у функціях. При динамічному визначенні перелік видимих змінних та їхні значення є результатом послідовності викликів функцій, яка спричинила досягнення у процесі виконання поточної функції. Значення змінної, яке бачить функція, залежить від її значення у місці виклику, якщо таке визначено, того, перебуває місце виклику у «загальній» області видимості чи у іншій функції оболонки. Також, це значення, яке «затіняє» локальне оголошення змінної, і значення, яке відновлено при поверненні з функції.

Наприклад, якщо змінну змінна оголошено як локальну у функції функція1, і функція функція1 викликає іншу функцію функція2, посилання на змінна, які використано у функція2, дадуть локальну змінну змінна з функція1, яка затіняє будь-яку загальну змінну із назвою змінна.

Вбудована команда unset також працює з використанням тієї самої динамічної області видимості: якщо змінна є локальною для поточної області видимості, unset скасує встановлення значення для неї; якщо ж ні, скасування значення стосуватиметься змінної, яку виявлено у будь-якій області видимості, звідки викликано функцію, як це описано вище. Якщо значення змінної у поточній локальній області видимості не встановлено, нічого не зміниться, аж доки значення у відповідній області видимості не буде встановлено або не буде виконано повернення з функції. Щойно буде виконано повернення з функції, будь-який екземпляр змінної у попередній області видимості стане видимим. Якщо скасування встановлення значення спрацює для змінної у попередній області видимості, будь-який екземпляр змінної із тією самою назвою, який було затінено, стане знову видимим.

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

Якщо у функції буде виконано вбудовану команду return, виконання функції буде завершено і оболонка перейде до виконання наступної після виклику функції команди. Перед поновленням виконання буде виконано усі команди, які пов'язано із пасткою RETURN. Під час завершення роботи функції буде відновлено значення, які мали перед виконанням функції усі позиційні параметри та особливий параметр #.

Отримати список назв і визначень функцій можна за допомогою параметра -f вбудованих команд declare і typeset. Використання параметра -F вбудованих команд declare і typeset призведе до виведення списку лише назв функцій (і, необов'язково, файла-джерела та номера рядка, якщо увімкнено параметр оболонки extdebug). Функції можна експортувати так, що їх було автоматично визначено у підоболонках, — скористайтеся параметром -f вбудованої команди export. Визначення функції можна вилучити за допомогою параметра -f вбудованої команди unset.

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

АРИФМЕТИЧНЕ ОЦІНЮВАННЯ

Оболонка, за певних умов, уможливлює арифметичні обчислення (див. вбудовані команди let і declare, складену команду (( та Арифметичні обчислення). Обчислення буде виконано у цілих числах із фіксованою шириною без перевірок на переповнення, хоча ділення на 0 буде перехоплено із повідомленням про помилку. Оператори, їхня пріоритетність, асоціативність та значення є тими самими, що і у мові C. Нижче наведено список операторів, які згруповано за рівнями рівної пріоритетності. Рівні у списку впорядковано за спаданням пріоритетності.

післяінкремент і післядекремент змінної
- +
унарні мінус та плюс
++ідентифікатор --ідентифікатор
доінкремент та додекремент змінної
! ~
логічне та порозрядне заперечення
**
піднесення до степеня
* / %
множення, ділення, залишок ділення
+ -
додавання, віднімання
<< >>
лівий та правий порозрядний зсув
<= >= < >
порівняння
== !=
рівність та нерівність
&
бітова «І»
^
порозрядне виключне АБО
|
бітове «АБО»
&&
логічне «І»
||
логічне «АБО»
умовний оператор
= *= /= %= += -= <<= >>= &= ^= |=
присвоювання
кома

Змінні оболонки можна використовувати як операнди; буде виконано розгортання параметрів до обчислення виразу. У виразі на змінні оболонки можна посилатися за назвою без використання синтаксису розгортання параметрів. Обчисленим значенням змінної оболонки, яка є порожньою або не встановленою, вважатиметься 0 при посиланні за назвою без використання синтаксису розгортання параметрів. Значення змінної буде обчислено як арифметичний вираз при посиланні на неї, або коли змінній, якій було надано атрибут integer за допомогою declare -i буде надано значення. Порожнє значення відповідає 0. Для використання у виразі для змінної оболонки не обов'язково має бути увімкнено атрибут integer.

Цілі сталі має бути визначено з використанням синтаксису визначення мови C без суфіксів або символьних сталих. Сталі з початковим 0 буде оброблено як вісімкові числа. Початковий рядок 0x або 0X позначає шістнадцяткове число. У всіх інших випадках, числа записують у формі [основа#]n, де необов'язковою частиною основа є десяткове число від 2 до 64, яке означає основу числення, а n — число у цій основі числення. Якщо рядок основа# не вказано, буде використано основу числення 10. При заданні n, якщо треба використати цифри, які не є десятковими, цифри після 9 слід вказувати як малі літери, великі літери, @ і _, саме у такому порядку. Якщо основа є числом, яке менше або рівне 36, можна використовувати як малі, так і великі літери для позначення цифр зі значеннями від 10 до 35.

Виконання операторів відбувається за пріоритетністю. Підвирази у дужках буде обчислено першими. Виразами у дужках можна скористатися для зміни описаних вище правил пріоритетності.

УМОВНІ ВИРАЗИ

Умовні вирази використовують у складених командах [[ та вбудованих командах test і [ для перевірки атрибутів файла і виконання рядкових і арифметичних порівнянь. Поведінка команд test і [ визначається кількістю їхніх аргументів; див. опис цих команд, щоб дізнатися про інші, специфічні для них, дії.

Вирази формуються з наведених нижче унарних або бінарних базових частин. Якщо у виразах використано декілька назв файлів, bash оброблятиме їх за особливими правилами. Якщо в операційній системі, у якій запущено bash передбачено існування вказаних нижче особливих файлів, bash використає їх; в усіх інших випадках, програма емулюватиме ці файли на внутрішньому рівні за такими правилами: якщо якийсь з аргументів файл однієї з базових частин записано у формі /dev/fd/n, буде перевірено файл із дескриптором n; якщо якийсь з аргументів файл однієї з базових частин є одним з рядків /dev/stdin, /dev/stdout або /dev/stderr, буде перевірено файли із дескрипторами 0, 1 або 2, відповідно.

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

Якщо використано [[, оператори < і > лексикографічно упорядковуватимуться з використанням порядку поточної локалі. Команда test упорядковує за порядком символів в ASCII.

Істина, якщо файл існує.
Істина, якщо файл існує і є спеціальним блоковим файлом.
Істина, якщо файл існує і є спеціальним символьним файлом.
Істина, якщо файл існує і є каталогом.
Істина, якщо файл існує.
Істина, якщо файл існує і є звичайним файлом.
Істина, якщо файл існує і має встановленим біт групи.
Істина, якщо файл існує і є символічною ланкою.
Істина, якщо файл існує і має встановленим «липкий» біт.

Істина, якщо файл існує і є іменованим каналом (FIFO).
Істина, якщо файл існує і є придатним до читання.
Істина, якщо файл існує і має ненульовий розмір.
Істина, якщо дескриптор файлу дескриптор_файла відкритий і вказує на термінал.
Істина, якщо файл існує і має встановленим біт встановити-ІД-користувача.
Істина, якщо файл існує і в нього можна писати.
Істина, якщо файл існує і є виконуваним.
Істина, якщо файл існує і його власником є чинний ІД групи.
Істина, якщо файл існує і є символічною ланкою.
Істина, якщо файл існує та був змінений після останнього читання.
Істина, якщо файл існує і його власником є чинний ІД користувача.
Істина, якщо файл існує і є сокетом.
файл1 -ef файл2
Істина, якщо файл1 і файл2 є посиланнями на той самий пристрій або номер inode.
файл1 -nt файл2
Істина, якщо файл1 є новішим (за даною внесених змін) за файл2, або якщо файл1 існує, а файл2 — ні.
файл1 -ot файл2
Істина, якщо файл1 є старішим за файл2, або якщо файл2 існує, а файл — ні.
Істина, якщо увімкнено параметр оболонки назва_параметра. Див. список параметрів під описом параметра -o вбудованої команди set нижче.
Істина, якщо змінну оболонки назва_змінної встановлено (їй надано значення).
Істина, якщо змінну оболонки назва_змінної встановлено і вона є посиланням на назву.
Істина, якщо довжина рядка рядок є нульовою.
рядок
Істина, якщо довжина рядка рядок є ненульовою.
рядок1 == рядок2
рядок1 = рядок2
Істина, якщо рядки є однаковими. Для сумісності із POSIX слід використовувати = у команді test. Якщо використано із командою [[, буде виконано встановлення відповідності взірцю, як це описано вище (складені команди).
рядок1 != рядок2
Істина, якщо рядки не є рівними.
рядок1 < рядок2
Істина, якщо рядок1 стоїть вище за рядок2 при лексикографічному упорядковуванні.
рядок1 > рядок2
Істина, якщо рядок1 стоїть нижче за рядок2 при лексикографічному упорядковуванні.
аргумент1 OP аргумент2
OP є одним із таких операторів: -eq, -ne, -lt, -le, -gt або -ge. Ці арифметичні бінарні оператори повертаю значення «істина», якщо аргумент1 є рівним, не рівним, меншим, меншим або рівним, більшим або більшим або рівним за аргумент2, відповідно. Аргумент1 і аргумент2 мають бути додатними або від'ємними цілими числами. При використанні у команді [[, аргумент1 і аргумент2 буде обчислено як арифметичні вираз (див. АРИФМЕТИЧНІ ОБЧИСЛЕННЯ вище).

РОЗГОРТАННЯ ПРОСТИХ КОМАНД

При виконання простих команд оболонка виконує вказані нижче розгортання, встановлення значень та переспрямування, зліва праворуч, у вказаному нижче порядку.

1.
Слова, які обробник позначив як надання змінним значень (які передують назві команди), і переспрямування буде збережено для подальшої обробки.
2.
Слова, які не є встановленнями значень змінних або переспрямуваннями буде розгорнуто. Якщо після розгортання лишаться якісь слова, перше слово вважатиметься назвою команди, а решта слів — її аргументами.
3.
Переспрямовування виконуватиметься так, як це описано вище у розділі ПЕРЕСПРЯМУВАННЯ.
4.
Текст після = у всіх встановленнях значень змінної підлягає розгортанню тильди, розгортанню параметрів, заміні команд, арифметичним обчисленням та вилученню нейтралізації, перш ніж його буде призначено до зміннної.

Якщо назви команди не отримано, присвоєння значень змінним впливають на поточне середовище оболонки. В іншому випадку змінні додаються до середовища виконуваної команди і не впливають на поточне середовище оболонки. Якщо будь-яке з присвоєнь намагається присвоїти значення змінній лише для читання, виникає помилка, і команда завершується із ненульовим станом.

Якщо назви команди не отримано, перенаправлення виконуються, але не впливають на поточне середовище оболонки. Помилка переспрямування призводить до завершення команди з ненульовим станом.

Якщо після розширення залишилася назва команди, виконання продовжується, як описано нижче. В іншому випадку команда завершується. Якщо одне з розширень містило заміну команди, стан виходу команди такий, як стан виходу останньої виконаної заміни команди. Якщо заміни команд не було, команда виходить зі станом нуль.

ВИКОНАННЯ КОМАНД

Після поділу команди на слова, якщо результат є простою командою і необов'язковим списком аргументів, буде виконано описані нижче дії.

Якщо назва команди не містить похилих рисок, оболонка намагається знайти її. Якщо існує функція оболонки з такою назвою, ця функція викликається, як описано вище в ФУНКЦІЇ. Якщо назва не відповідає функції, оболонка шукає її у списку вбудованих команд оболонки. Якщо збіг знайдено, буде викликано цю вбудовану команду.

Якщо назва не є ні функцією оболонки, ні вбудованою командою, і не містить похилих рисок, bash шукає серед елементів PATH каталог, що містить виконуваний файл з такою назвою. Bash для запам'ятовування повних назв виконуваних файлів використовує геш-таблицю (див. нижче геш під заголовком ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ). Повний пошук у каталогах із PATH виконується лише тоді, коли команду не знайдено в геш-таблиці. Якщо пошук невдалий, оболонка шукає визначену функцію оболонки під назвою command_not_found_handle. Якщо така функція існує, вона викликається в окремому середовищі виконання, отримавши, як аргументи, початкову команду та її аргументи, а стан виходу функції стає станом виходу цієї підоболонки. Якщо цю функцію не визначено, оболонка друкує повідомлення про помилку та повертає стан виходу 127.

Якщо пошук пройшов успішно, або якщо назва команди містить одну чи кілька похилих рисок, оболонка виконує названу програму в окремому середовищі виконання. Аргумент 0 стає рівним зазначеній назві, а решта аргументів команди — наданим аргументам, якщо такі є.

Якщо це виконання не вдається, оскільки файл не виконуваного формату і не є каталогом, вважається, що це скрипт оболонки, файл, що містить команди оболонки. Для його виконання створюється підоболонка. Ця підоболонка повторно ініціалізується, так що результат виглядає так, ніби для обробки скрипту викликано нову оболонку, за винятком того, що розташування команд, які запам'ятав предок (див. нижче геш під заголовком ВБУДОВАНІ КОМАНДИ ОБОЛОНКИ), зберігає нащадок.

Якщо програма є файлом, що починається з #!, залишок першого рядка визначає інтерпретатор для програми. Оболонка виконує зазначений інтерпретатор в операційних системах, які самі не обробляють файлів цього виконуваного формату. Аргументами інтерпретатора є один необов’язковий аргумент після назви інтерпретатора в першому рядку програми, за яким йде назва програми, а потім - аргументи команди, якщо такі є.

СЕРЕДОВИЩЕ ВИКОНАННЯ КОМАНД

Оболонка має середовище виконання, яке складається з таких компонентів:

  • відкриті файли, які успадковано оболонкою на момент виклику із модифікаціями з використанням переспрямувань, які передано вбудованій команді exec
  • поточний робочий каталог, який встановлено командами cd, pushd або popd чи успадковано оболонкою на момент виклику
  • маска режиму створення файлів, яку встановлено за допомогою umask або успадковано від батьківського процесу оболонки
  • поточні пастки, які встановлено за допомогою trap
  • параметри оболонки, які встановлено наданням значень змінним або за допомогою команди set чи успадковано від батьківського процесу оболонки у середовищі
  • функції оболонки, які визначено під час виконання або успадковано від батьківського проц