Если после обработки опций остались аргументы и не указаны опции или , первый аргумент считается именем файла, содержащего команды интерпретатора. Если bash вызван таким образом, параметр $0
устанавливается равным имени файла, а значениями позиционных параметров становятся другие аргументы. Командный интерпретатор bash читает и выполняет команды из этого файла, а затем завершает работу. Статусом выхода bash является статус выхода последней команды, выполненной в сценарии. Если ни одна команда не выполнена, статус выхода - 0.
Конвейер - это последовательность одной или более команд, разделенных символом |. Конвейер имеет следующий формат:
[time [-p]] [ ! ] команда [ | команда2 ... ]
Стандартный выходной поток команды связывается со стандартным входным потоком команды2. Эта связь выполняется раньше, чем любые перенаправления, задаваемые командой (см. ниже).
Если перед конвейером указано зарезервированное слово !, статус выхода такого конвейера является логическим отрицанием статуса выхода последней команды. В противном случае, статус выхода конвейера совпадает со статусом выхода последней команды. Прежде, чем возвращать значение, командный интерпретатор ждет завершения всех команд в конвейере.
Если перед конвейером идет зарезервированное слово time, после завершения конвейера выдается общее, пользовательское и системное время, потраченное на его выполнение. Опция изменяет формат вывода на задаваемый стандартом POSIX. Переменная TIMEFORMAT может задавать строку формата выдачи информации о времени; см. описание переменной TIMEFORMAT в разделе ниже.
Каждая команда в конвейере выполняется как отдельный процесс (т.е. в порожденном интерпретаторе).
Маскировка (quoting) используется для отмены специального значения для командного интерпретатора определенных символов или слов. Маскировку можно использовать для отмены специфической обработки специальных символов, для предотвращения распознавания зарезервированных слов, а также для предотвращения подстановки параметров.
Каждый из метасимволов, перечисленных выше в разделе "", имеет специальное значение для командного интерпретатора и должен маскироваться, если используется буквально. Имеется три механизма маскировки: символ маскировки (escape character), одиночные кавычки и двойные кавычки.
Незамаскированная обратная косая черта (\) является символом маскировки. Он требует использовать следующий за ним символ (за исключением перевода строки) буквально. Если введена пара символов \ и сама обратная косая не замаскирована, эта пара обрабатывается как признак продолжения строки (т.е. она удаляется из входного потока и, по сути, игнорируется).
Все символы в одиночных кавычках используются буквально. Символ одиночной кавычки (апостроф) не должен указываться между одиночными кавычками, даже если он предваряется обратной косой.
Символы в двойных кавычках используются буквально, за исключением символов $, ` и \. Символы $ и ` в двойных кавычках имеют то же специальное значение. Обратная косая имеет специальное значение только если после нее идет один из следующих символов: $, `, ", \ или . Двойную кавычку можно указывать в двойных кавычках, замаскировав обратной косой.
Специальные параметры * и @ имеют специальное значение при указании в двойных кавычках (см. раздел ниже).
Слова вида $'строка' обрабатываются особым образомy. Слово заменяется строкой, в которой предваренные обратной косой символы заменяются в соответствии со стандартом ANSI C. Управляющие последовательности, начинающиеся с обратной косой, декодируются следующим образом:
| \a | тревога (звонок) |
| \b | забой |
| \e | управляющий символ |
| \f | прогон страницы (form feed) |
| \n | перевод строки (new line) |
| \r | carriage return (возврат каретки) |
| \t | табуляция |
| \v | вертикальная табудяция |
| \\ | обратная косая |
| \nnn | символ, ASCII-код которого совпадает с восьмеричным значением nnn (от одной до трех цифр) |
| \xnnn | символ, ASCII-код которого совпадает с шестнадцатеричным значением nnn (от одной до трех цифр) |
Преобразованный результат помещается в одиночные кавычки, как если бы символа доллара просто не было.
Строка в двойных кавычках, перед которой идет символ доллара ($), будет преобразована в соответствии с текущей локалью. Если текущая локаль - C или POSIX, символ доллара игнорируется. Если строка преобразована и заменена, результат помещается в двойные кавычки.
Помимо однобуквенных опций командного интерпретатора, представленных в описании встроенной команды , bash интерпретирует при вызове следующие опции:
| -c строка | Если указана опция -c, команды читаются из строки. Если после строки есть аргументы, их значения присваиваются позиционным параметрам, начиная с $0. |
| -r | Если указана опция -r, командный интерпретатор становится ограниченным (см. "" ниже). |
| -i | Если указана опция -i, командный интерпретатор работает как интерактивный. |
| -s | Если указана опция -s или если после обработки опций аргументов не остается, команды читаются из стандартного входного потока. Эта опция позволяет устанавливать позиционные параметры при вызове интерактивного командного интерпретатора. |
| -D | Список всех строк в двойных кавычках с префиксом $
выдается в стандартный выходной поток. Это строки, которые необходимо перевести на соответствующий язык, если текущая локаль отличается от C или POSIX. При этом неявно предполагается опция -n; никакие команды выполняться не будут. |
| -- | Пара дефисов (--) обозначает конец опций и отключает их дальнейшую обработку. Любые аргументы после -- рассматриваются как имена файлов и аргументы. Аргумент - эквивалентен --. |
Командный интерпретатор bash также интерпретирует несколько многосимвольных опций. Эти опции, чтобы они были распознаны, должны указываться в командной строке перед односимвольными опциями.
--dump-po-strings
Аналогична опции , но результат выдается в формате файла GNU gettext po (portable object - переносимый объект).
--dump-strings
Аналогична опции .
--help
Выдает в стандартный выходной поток сообщение об использовании и успешно завершает работу.
--login
Заставляет bash работать так, как если бы он был вызван в качестве начального командного интерпретатора (см. ниже).
--noediting
Не использует библиотеку GNU readline для чтения командных строк в интерактивном режиме.
--noprofile
Не читает ни общесистемный файл начального запуска /etc/profile, ни любой из персональных файлов инициализации пользователя ~/.bash_profile, ~/.bash_login или ~/.profile. По умолчанию, bash читает эти файлы при вызове в качестве начального командного интерпретатора (см. ниже).
--norc
Не читает и не выполняет персональный файл инициализации ~/.bashrc, если командный интерпретатор работает интерактивно. Эта опция по умолчанию включена, если интерпретатор вызван как sh.
--posix
Изменяет на стандартное поведение bash в тех случаях, когда оно отличается от предполагаемого стандартом POSIX 1003.2.
--rcfile файл
Выполняет команды из указанного файла вместо стандартного персонального файла инициализации ~/.bashrc, если командный интерпретатор работает интерактивно (см. ниже).
--restricted
Командный интерпретатор становится ограниченным (см. "" ниже).
--verbose
Аналогична опции .
--version
Выдает информацию о версии данного экземпляра bash в стандартный выходной поток и успешно завершает работу.
В оставшейся части документа используются следующие термины.
пробел
Символ пробела или символ табуляции.
слово
Последовательность символов, рассматриваемая командным интерпретатором как единое целое. Также называется лексемой (token).
имя
Слово, состоящее только из алфавитноцифровых символов и символов подчеркивания, и начинающееся с буквы или символа подчеркивания. Также называется идентификатором.
метасимвол
Символ, разделяющий слова, если он не замаскирован. Один из следующих символов:
| & ; ( ) < > пробел табуляция
управляющий оператор
Лексема, выполняющая функцию управления. Это один из следующих символов:
& && ; ;; ( ) | <перевод строки>
Простая команда - это завершающаяся управляющим оператором последовательность необязательных присваиваний значений переменным, после которых идут слова, разделенные пробелами, и перенаправления потоков. Первое слово задает команду, которую надо выполнить. Оставшиеся слова передаются как аргументы вызванной команде.
Возвращаемым значением простой команды является ее статус выхода, или 128+n, если команда завершена сигналом n.
Составными называют следующие команды:
(список)
Список выполняется в порожденном командном интерпретаторе. Присваивания переменным и встроенные команды, влияющие на среду командного интерпретатора, не действуют после завершения команды. Статусом возврата является статус выхода списка.
{ список; }
Список просто выполняется в среде текущего командного интерпретатора. Список должен завершаться переводом строки или точкой с запятой. Эту команду называют командой группировки. Статусом возврата является статус выхода списка.
((выражение))
Выражение вычисляется в соответствии с правилами, описанными ниже в разделе "". Если выражение
имеет ненулевое значение, статус возврата равен 0; в противном случае - 1. Эта конструкция эквивалентна конструкции let "выражение".
[[ выражение ]]
Возвращает статус 0 или 1 в зависимости от значения указанного условного выражения. Выражения состоят из компонентов, описанных ниже в разделе "". Деление слов и подстановка имен файлов в словах между [[ и ]] не выполняется; выполняется замена тильды, подстановка значений параметров и переменных, арифметическая подстановка, подстановка результатов команд и подстановка процессов, а также удаление кавычек.
При использовании операторов == и != строка справа оператора считается образцом и сопоставляется по правилам, описанным ниже в подразделе "". Возвращается значение 0 если строка, соответственно, сопоставляется и не сопоставляется с образцом, и 1 в противном случае. Любая часть образца может быть взята в кавычки, чтобы сопоставление с ней шло буквально.
Выражения можно комбинировать с помощью следующих операторов, перечисленных в порядке снижения приоритета:
( выражение )
Возвращает значение выражения. Круглые скобки можно использовать для изменения обычного приоритета операторов.
! выражение
Истинно, если выражение ложно.
выражение1 && выражение2
Истинно, если истинны оба выражения, выражение1 и выражение2.
выражение1 выражение2
Список - это последовательность одного или более конвейеров, разделенных одним из операторов ;, &, && или , и не обязательно завершающаяся одним из операторов ;, & или <перевод строки>.
Из этих операторов списка && и имеют равный приоритет, причем больший, чем ; и &, тоже имеющие равный приоритет.
Если команда завершается управляющим оператором &, интерпретатор выполняет команду в фоновом режиме в порожденном интерпретаторе. Командный интерпретатор не ждет завершения команды, а статус выхода в этом случае - 0. Команды, разделенные ; выполняются последовательно; командный интерпретатор ждет поочередно завершения каждой из команд. Статус возврата списка в этом случае совпадает со статусом возврата последней выполненной команды.
Управляющие операторы && и обозначают, соответственно, И-списки и ИЛИ-списки. И-список имеет вид
команда && команда2
Команда2 выполняется только и если только команда вернула статус выхода ноль.
ИЛИ-список имеет вид
команда команда2
Команда2 выполняется только и если только команда вернула ненулевой статус выхода. И- и ИЛИ-списки возвращают статус последней команды, выполненной в списке.
Начальный командный интерпретатор (login shell) - это интерпретатор, первый символ нулевого аргумента которого является дефисом (-) или который запущен с опцией .
Интерактивным является командный интерпретатор, стандартный входной и выходной потоки которого подключены к терминалам (что определяется с помощью функции isatty(3)), или запущенный с опцией . Переменная среды PS1 устанавливается и флаги ($-) включают i, только если bash является интерактивным интерпретатором, что позволяет проверить это в файле начального запуска или в сценарии командного интерпретатора.
Следующие абзацы описывают, как bash выполняет свои файлы начального запуска. Если любой из этих файлов существует, но не может быть прочитан, bash выдает сообщение об ошибке. Символы тильды (~) в именах файлов заменяются так, как описано в подразделе "" раздела "".
При вызове bash как интерактивного начального командного интерпретатора, или как неинтерактивного интерпретатора с опцией , он сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он последовательно ищет файлы ~/.bash_profile, ~/.bash_login и ~/.profile, читает и выполняет команды из первого же из них, который существует и доступен на чтение. Опция может использоваться при запуске командного интерпретатора, чтобы отменить это действие.
При завершении работы в качестве начального командного интерпретатора bash читает и выполняет команды в файле ~/.bash_logout, если он существует.
При запуске интерактивного командного интерпретатора, не являющегося начальным, bash читает и выполняет команды из файла ~/.bashrc, если он существует. Это действие можно отменить с помощью опции . Опция заставляет bash
читать и выполнять команды из указанного файла вместо ~/.bashrc.
При неинтерактивном запуске bash, например, для выполнения сценария, командный интерпретатор ищет в среде переменную BASH_ENV, получает ее значение и использует его в качестве имени файла, который необходимо прочитать и выполнить. bash ведет себя так, как если бы была выполнена следующая команда:
Зарезервированными являются слова, имеющие специальное значение для командного интерпретатора. Следующие слова распознаются как зарезервированные, если не замаскированы и являются либо первым словом простой команды (см. ниже), либо третьим словом команды или :
! case do done elif else
esac fi for function if in
select then until while { }
time [[ ]]