АРГУМЕНТЫ
Если после обработки опций остались аргументы и не указаны опции или , первый аргумент считается именем файла, содержащего команды интерпретатора. Если bash вызван таким образом, параметр $0
устанавливается равным имени файла, а значениями позиционных параметров становятся другие аргументы. Командный интерпретатор bash читает и выполняет команды из этого файла, а затем завершает работу. Статусом выхода bash является статус выхода последней команды, выполненной в сценарии. Если ни одна команда не выполнена, статус выхода - 0.
В неинтерактивном командном интерпретаторе или
В неинтерактивном командном интерпретаторе или в интерактивном с включенной опцией interactive_comments встроенной команды (см. раздел "" ниже), слово, начинающиеся символом #, влечет игнорирование этого слова и последующих символов в строке. Интерактивный командный интерпретатор с не включенной опцией interactive_comments не допускает использования комментариев. Опция interactive_comments по умолчанию включается в интерактивных командных интерпретаторах.
Конвейеры
Конвейер - это последовательность одной или более команд, разделенных символом |. Конвейер имеет следующий формат:
[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 в стандартный выходной поток и успешно завершает работу.
совместимый интерпретатор командного языка, выполняющий
bash - это sh- совместимый интерпретатор командного языка, выполняющий команды, прочитанные со стандартного входного потока или из файла. Командный интерпретатор bash также включает полезные средства командных интерпретаторов Korn и C (ksh и csh).
Командный интерпретатор bash создавался как соответствующий спецификации командного интерпретатора и инструментальных средств IEEE POSIX () (IEEE Working Group 1003.2).
ОПРЕДЕЛЕНИЯ
В оставшейся части документа используются следующие термины.
пробел
Символ пробела или символ табуляции.
слово
Последовательность символов, рассматриваемая командным интерпретатором как единое целое. Также называется лексемой (token).
имя
Слово, состоящее только из алфавитноцифровых символов и символов подчеркивания, и начинающееся с буквы или символа подчеркивания. Также называется идентификатором.
метасимвол
Символ, разделяющий слова, если он не замаскирован. Один из следующих символов:
| & ; ( ) < > пробел табуляция
управляющий оператор
Лексема, выполняющая функцию управления. Это один из следующих символов:
& && ; ;; ( ) | <перевод строки>
Простые команды
Простая команда - это завершающаяся управляющим оператором последовательность необязательных присваиваний значений переменным, после которых идут слова, разделенные пробелами, и перенаправления потоков. Первое слово задает команду, которую надо выполнить. Оставшиеся слова передаются как аргументы вызванной команде.
Возвращаемым значением простой команды является ее статус выхода, или 128+n, если команда завершена сигналом n.
Составные команды
Составными называют следующие команды:
(список)
Список выполняется в порожденном командном интерпретаторе. Присваивания переменным и встроенные команды, влияющие на среду командного интерпретатора, не действуют после завершения команды. Статусом возврата является статус выхода списка.
{ список; }
Список просто выполняется в среде текущего командного интерпретатора. Список должен завершаться переводом строки или точкой с запятой. Эту команду называют командой группировки. Статусом возврата является статус выхода списка.
((выражение))
Выражение вычисляется в соответствии с правилами, описанными ниже в разделе "". Если выражение
имеет ненулевое значение, статус возврата равен 0; в противном случае - 1. Эта конструкция эквивалентна конструкции let "выражение".
[[ выражение ]]
Возвращает статус 0 или 1 в зависимости от значения указанного условного выражения. Выражения состоят из компонентов, описанных ниже в разделе "". Деление слов и подстановка имен файлов в словах между [[ и ]] не выполняется; выполняется замена тильды, подстановка значений параметров и переменных, арифметическая подстановка, подстановка результатов команд и подстановка процессов, а также удаление кавычек.
При использовании операторов == и != строка справа оператора считается образцом и сопоставляется по правилам, описанным ниже в подразделе "". Возвращается значение 0 если строка, соответственно, сопоставляется и не сопоставляется с образцом, и 1 в противном случае. Любая часть образца может быть взята в кавычки, чтобы сопоставление с ней шло буквально.
Выражения можно комбинировать с помощью следующих операторов, перечисленных в порядке снижения приоритета:
( выражение )
Возвращает значение выражения. Круглые скобки можно использовать для изменения обычного приоритета операторов.
! выражение
Истинно, если выражение ложно.
выражение1 && выражение2
Истинно, если истинны оба выражения, выражение1 и выражение2.
выражение1 выражение2
Истинно, если истинно выражение1 или выражение2.
Операторы && и не вычисляют выражение2, если значения выражения1 достаточно для определения возвращаемого значения всего условного выражения.
for имя [ in список_слов ] ; do список ; done
Выполняются подстановки в списке_слов после in, в результате чего получается список элементов. Переменная с соответствующим именем последовательно получает значение каждого элемента этого списка, и каждый раз выполняется список. Если слово in не указано, команда for выполняет список для каждого установленного позиционного параметра (см. раздел "" ниже). Сатусом возврата является статус выхода последней выполненной команды. Если в результате подстановок элементов списка_слов после in получается пустой список, команды не выполняются и возвращается статус 0.
select имя [ in список_слов ] ; do список ; done
Выполняются подстановки в списке_слов после in, в результате чего получается список элементов. Набор полученных после подстановки слов выдается в стандартный поток ошибок, причем перед каждым элементом выдается его порядковый номер. Если слово in не указано, выдаются установленные позиционные параметры (см. раздел "" ниже). Затем выдается приглашение PS3
и читается строка со стандартного входного потока. Если эта строка содержит число, соответствующее одному из выданных слов, то переменная имя получает его значение. Если строка пустая, слова и приглашение выдаются снова. Если прочитан символ конца файла (EOF), команда заврешается. При вводе любого другого значения переменная имя
получает пустое значение. Прочитанная строка сохраняется в переменной REPLY. Список выполняется после каждого выбора, пока не будет выполнена команда break или return. Статусом выхода команды select является статус выхода последней команды в списке, или 0, если ни одна команда не была выполнена.
case слово in [ ( образец [ | образец ] ... ) список ;; ] ... esac
Команда case сначала подставляет значение слова и пытается его сопоставить поочередно с каждым образцом, используя те же правила сопоставления, что и для имен файлов (см. подраздел "Подстановка имен файлов"). Если найден сопоставляющийся образец, выполняется соответствующий список. После нахождения первого сопоставления дальнейшее сопоставление не выполняется и команда завершается. Статус выхода равен 0, если ни один образец не сопоставился. В противном случае, он равен статусу выхода последней выполненной команды из соответствующего списка.
if список; then список; [ elif список; then список; ] ... [ else список; ] fi
Выполняется список после if. Если его статус выхода - 0, выполняется список после then. В противном случае, выполняется последовательно список в очередной конструкции elif, и если его статус выхода - 0, выполняется соответствующий список после then
и команда завершается. Если все конструкции elif проверены и ни один из списков не вернул статус 0, выполняется список после else, если эта конструкция задана. Статусом выхода является статус выхода последней выполненной команды или 0, если ни одно из условий не оказалось истинным.
while список; do список; done
until список; do список; done
Команда while циклически выполняет список после do, пока последняя команда списка возвращает статус выхода 0. Команда until идентична команде while, но условие завершения - противоположно; список после do выполняется, пока последняя команда списка возвращает ненулевой статус выхода. Статусом выхода команд while и until является статус выхода последней выполненной команды списка или 0, если ни одна команда не выполнена.
[ function ] имя () { список; }
Эта команда определяет функцию с указанным именем. Тело функции образует список команд между фигурными скобками { и }. Этот список выполняется каждый раз, когда имя функции указывается как имя простой команлы. Статусом выхода функции является статус выхода последней команды, выполненной в теле функции. (См. раздел "" ниже.)
Списки
Список - это последовательность одного или более конвейеров, разделенных одним из операторов ;, &, && или , и не обязательно завершающаяся одним из операторов ;, & или <перевод строки>.
Из этих операторов списка && и имеют равный приоритет, причем больший, чем ; и &, тоже имеющие равный приоритет.
Если команда завершается управляющим оператором &, интерпретатор выполняет команду в фоновом режиме в порожденном интерпретаторе. Командный интерпретатор не ждет завершения команды, а статус выхода в этом случае - 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 ведет себя так, как если бы была выполнена следующая команда:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
но при поиске имени файла не используется значение переменной PATH.
Если bash вызван с именем sh, он пытается, наколько это возможно, имитировать поведение при запуске старых версий интерпретатора sh, соответствуя при этом стандарту POSIX. При вызове в качестве интерактивного начального командного интерпретатора или неинтерактивного, но с опцией , он сначала пытается читать и выполнять команды последовательно из файлов /etc/profile и ~/.profile. Для отмены этого действия можно использовать опцию . При вызове в качестве интерактивного командного интерпретатора с именем sh, bash ищет переменную среды ENV, получает ее значение, если оно задано, и использует это значение в качестве имени файла, который необходимо прочитать и выполнить. Поскольку интерпретатор, вызванный как sh, не пытается читать и выполнять команды в других файлах начального запуска, опция не действует. Неинтерактивный командый интерпретатор, вызванный с именем sh, не пытается читать и выполнять никакие файлы начального запуска. При вызове по имени sh, командный интерпретатор bash входит в режим posix после прочтения файлов начального запуска.
При запуске bash в режиме posix, например, с помощью опции командной строки , он следует стандарту POSIX при работе с файлами начального запуска. В этом режиме интерактивные командные интерпретаторы берут значение переменной среды ENV, читают и выполняют команды из соответствующего файла. Никакие другие файлы начального запуска не читаются.
Командный интерпретатор bash пытается определить, не запущен ли он демоном удаленного командного интерпретатора, обычно, rshd. Если оказывается, что bash запущен демоном rshd, он читает и выполняет команды из файла ~/.bashrc, если этот файл существует и доступен на чтение. Командный интерпретатор bash так не делает, если запущен как sh. Для отмены этого действия можно использовать опцию , а с помощью опции можно заставить читать другой файл, но обычно демон rshd не задает эти опции командному интерпретатору и не позволяет их указать.
Если командный интерпретатор запущен с эффективным идентификатором пользователя (группы), не совпадающим с реальным идентификатором пользователя (группы), и не указана опция , файлы начального запуска не читаются, функции командного интерпретатора не наследуются из среды, переменная SHELLOPTS, если она задана в среде, игнорируется, а эффективный идентификатор пользователя устанавливается равным реальному. Если при вызове задана опция , файлы начального запуска тоже не читаются, но эффективный идентификатор пользователя не сбрасывается.
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА
Зарезервированными являются слова, имеющие специальное значение для командного интерпретатора. Следующие слова распознаются как зарезервированные, если не замаскированы и являются либо первым словом простой команды (см. ниже), либо третьим словом команды или :
! case do done elif else
esac fi for function if in
select then until while { }
time [[ ]]