Пользовательские команды |
bash(1) |
bash - командный интерпретатор GNU Bourne-Again SHell
Командный интерпретатор bash создан Фондом свободно распространяемого программного обеспечения. Copyright (C) 1989-1999 by the Free Software Foundation, Inc.
bash - это sh-совместимый интерпретатор командного языка, выполняющий команды, прочитанные со стандартного входного потока или из файла. Командный интерпретатор bash также включает полезные средства командных интерпретаторов Korn и C (ksh и csh).
Командный интерпретатор bash создавался как соответствующий спецификации командного интерпретатора и инструментальных средств IEEE POSIX (IEEE POSIX Shell and Tools specification) (IEEE Working Group 1003.2).
Помимо однобуквенных опций командного интерпретатора, представленных в описании встроенной команды set, bash интерпретирует при вызове следующие опции:
-c строка | Если указана опция -c, команды читаются из строки. Если после строки есть аргументы, их значения присваиваются позиционным параметрам, начиная с $0. |
-r | Если указана опция -r, командный интерпретатор становится ограниченным (см. "ОГРАНИЧЕННЫЙ КОМАНДНЫЙ ИНТЕРПРЕТАТОР" ниже). |
-i | Если указана опция -i, командный интерпретатор работает как интерактивный. |
-s | Если указана опция -s или если после обработки опций аргументов не остается, команды читаются из стандартного входного потока. Эта опция позволяет устанавливать позиционные параметры при вызове интерактивного командного интерпретатора. |
-D | Список всех строк в двойных кавычках с префиксом $ выдается в стандартный выходной поток. Это строки, которые необходимо перевести на соответствующий язык, если текущая локаль отличается от C или POSIX. При этом неявно предполагается опция -n; никакие команды выполняться не будут. |
-- | Пара дефисов (--) обозначает конец опций и отключает их дальнейшую обработку. Любые аргументы после -- рассматриваются как имена файлов и аргументы. Аргумент - эквивалентен --. |
Командный интерпретатор bash также интерпретирует несколько многосимвольных опций. Эти опции, чтобы они были распознаны, должны указываться в командной строке перед односимвольными опциями.
Если после обработки опций остались аргументы и не указаны опции -c или -s, первый аргумент считается именем файла, содержащего команды интерпретатора. Если bash вызван таким образом, параметр $0 устанавливается равным имени файла, а значениями позиционных параметров становятся другие аргументы. Командный интерпретатор bash читает и выполняет команды из этого файла, а затем завершает работу. Статусом выхода bash является статус выхода последней команды, выполненной в сценарии. Если ни одна команда не выполнена, статус выхода - 0.
Начальный командный интерпретатор (login shell) - это интерпретатор, первый символ нулевого аргумента которого является дефисом (-) или который запущен с опцией --login.
Интерактивным является командный интерпретатор, стандартный входной и выходной потоки которого подключены к терминалам (что определяется с помощью функции isatty(3)), или запущенный с опцией -i. Переменная среды PS1 устанавливается и флаги ($-) включают i, только если bash является интерактивным интерпретатором, что позволяет проверить это в файле начального запуска или в сценарии командного интерпретатора.
Следующие абзацы описывают, как bash выполняет свои файлы начального запуска. Если любой из этих файлов существует, но не может быть прочитан, bash выдает сообщение об ошибке. Символы тильды (~) в именах файлов заменяются так, как описано в подразделе "Замена тильды" раздела "ЗАМЕНЫ".
При вызове bash как интерактивного начального командного интерпретатора, или как неинтерактивного интерпретатора с опцией --login, он сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он последовательно ищет файлы ~/.bash_profile, ~/.bash_login и ~/.profile, читает и выполняет команды из первого же из них, который существует и доступен на чтение. Опция --noprofile может использоваться при запуске командного интерпретатора, чтобы отменить это действие.
При завершении работы в качестве начального командного интерпретатора bash читает и выполняет команды в файле ~/.bash_logout, если он существует.
При запуске интерактивного командного интерпретатора, не являющегося начальным, bash читает и выполняет команды из файла ~/.bashrc, если он существует. Это действие можно отменить с помощью опции --norc. Опция --rcfile файл заставляет bash читать и выполнять команды из указанного файла вместо ~/.bashrc.
При неинтерактивном запуске bash, например, для выполнения сценария, командный интерпретатор ищет в среде переменную BASH_ENV, получает ее значение и использует его в качестве имени файла, который необходимо прочитать и выполнить. bash ведет себя так, как если бы была выполнена следующая команда:
но при поиске имени файла не используется значение переменной PATH.
Если bash вызван с именем sh, он пытается, наколько это возможно, имитировать поведение при запуске старых версий интерпретатора sh, соответствуя при этом стандарту POSIX. При вызове в качестве интерактивного начального командного интерпретатора или неинтерактивного, но с опцией --login, он сначала пытается читать и выполнять команды последовательно из файлов /etc/profile и ~/.profile. Для отмены этого действия можно использовать опцию --noprofile. При вызове в качестве интерактивного командного интерпретатора с именем sh, bash ищет переменную среды ENV, получает ее значение, если оно задано, и использует это значение в качестве имени файла, который необходимо прочитать и выполнить. Поскольку интерпретатор, вызванный как sh, не пытается читать и выполнять команды в других файлах начального запуска, опция --rcfile не действует. Неинтерактивный командый интерпретатор, вызванный с именем sh, не пытается читать и выполнять никакие файлы начального запуска. При вызове по имени sh, командный интерпретатор bash входит в режим posix после прочтения файлов начального запуска.
При запуске bash в режиме posix, например, с помощью опции командной строки --posix, он следует стандарту POSIX при работе с файлами начального запуска. В этом режиме интерактивные командные интерпретаторы берут значение переменной среды ENV, читают и выполняют команды из соответствующего файла. Никакие другие файлы начального запуска не читаются.
Командный интерпретатор bash пытается определить, не запущен ли он демоном удаленного командного интерпретатора, обычно, rshd. Если оказывается, что bash запущен демоном rshd, он читает и выполняет команды из файла ~/.bashrc, если этот файл существует и доступен на чтение. Командный интерпретатор bash так не делает, если запущен как sh. Для отмены этого действия можно использовать опцию --norc, а с помощью опции --rcfile можно заставить читать другой файл, но обычно демон rshd не задает эти опции командному интерпретатору и не позволяет их указать.
Если командный интерпретатор запущен с эффективным идентификатором пользователя (группы), не совпадающим с реальным идентификатором пользователя (группы), и не указана опция -p, файлы начального запуска не читаются, функции командного интерпретатора не наследуются из среды, переменная SHELLOPTS, если она задана в среде, игнорируется, а эффективный идентификатор пользователя устанавливается равным реальному. Если при вызове задана опция -p, файлы начального запуска тоже не читаются, но эффективный идентификатор пользователя не сбрасывается.
В оставшейся части документа используются следующие термины.
Зарезервированными являются слова, имеющие специальное значение для командного интерпретатора. Следующие слова распознаются как зарезервированные, если не замаскированы и являются либо первым словом простой команды (см. "СИНТАКСИС КОМАНД" ниже), либо третьим словом команды case или for:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]Простая команда - это завершающаяся управляющим оператором последовательность необязательных присваиваний значений переменным, после которых идут слова, разделенные пробелами, и перенаправления потоков. Первое слово задает команду, которую надо выполнить. Оставшиеся слова передаются как аргументы вызванной команде.
Возвращаемым значением простой команды является ее статус выхода, или 128+n, если команда завершена сигналом n.
Конвейер - это последовательность одной или более команд, разделенных символом |. Конвейер имеет следующий формат:
Стандартный выходной поток команды связывается со стандартным входным потоком команды2. Эта связь выполняется раньше, чем любые перенаправления, задаваемые командой (см. "ПЕРЕНАПРАВЛЕНИЕ" ниже).
Если перед конвейером указано зарезервированное слово !, статус выхода такого конвейера является логическим отрицанием статуса выхода последней команды. В противном случае, статус выхода конвейера совпадает со статусом выхода последней команды. Прежде, чем возвращать значение, командный интерпретатор ждет завершения всех команд в конвейере.
Если перед конвейером идет зарезервированное слово time, после завершения конвейера выдается общее, пользовательское и системное время, потраченное на его выполнение. Опция -p изменяет формат вывода на задаваемый стандартом POSIX. Переменная TIMEFORMAT может задавать строку формата выдачи информации о времени; см. описание переменной TIMEFORMAT в разделе "Переменные командного интерпретатора" ниже.
Каждая команда в конвейере выполняется как отдельный процесс (т.е. в порожденном интерпретаторе).
Список - это последовательность одного или более конвейеров, разделенных одним из операторов ;, &, && или ||, и не обязательно завершающаяся одним из операторов ;, & или <перевод строки>.
Из этих операторов списка && и || имеют равный приоритет, причем больший, чем ; и &, тоже имеющие равный приоритет.
Если команда завершается управляющим оператором &, интерпретатор выполняет команду в фоновом режиме в порожденном интерпретаторе. Командный интерпретатор не ждет завершения команды, а статус выхода в этом случае - 0. Команды, разделенные ; выполняются последовательно; командный интерпретатор ждет поочередно завершения каждой из команд. Статус возврата списка в этом случае совпадает со статусом возврата последней выполненной команды.
Управляющие операторы && и || обозначают, соответственно, И-списки и ИЛИ-списки. И-список имеет вид
Команда2 выполняется только и если только команда вернула статус выхода ноль.
ИЛИ-список имеет вид
Команда2 выполняется только и если только команда вернула ненулевой статус выхода. И- и ИЛИ-списки возвращают статус последней команды, выполненной в списке.
Составными называют следующие команды:
При использовании операторов == и != строка справа оператора считается образцом и сопоставляется по правилам, описанным ниже в подразделе "Сопоставление с образцом". Возвращается значение 0 если строка, соответственно, сопоставляется и не сопоставляется с образцом, и 1 в противном случае. Любая часть образца может быть взята в кавычки, чтобы сопоставление с ней шло буквально.
Выражения можно комбинировать с помощью следующих операторов, перечисленных в порядке снижения приоритета:
В неинтерактивном командном интерпретаторе или в интерактивном с включенной опцией interactive_comments встроенной команды shopt (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже), слово, начинающиеся символом #, влечет игнорирование этого слова и последующих символов в строке. Интерактивный командный интерпретатор с не включенной опцией interactive_comments не допускает использования комментариев. Опция interactive_comments по умолчанию включается в интерактивных командных интерпретаторах.
Маскировка (quoting) используется для отмены специального значения для командного интерпретатора определенных символов или слов. Маскировку можно использовать для отмены специфической обработки специальных символов, для предотвращения распознавания зарезервированных слов, а также для предотвращения подстановки параметров.
Каждый из метасимволов, перечисленных выше в разделе "ОПРЕДЕЛЕНИЯ", имеет специальное значение для командного интерпретатора и должен маскироваться, если используется буквально. Имеется три механизма маскировки: символ маскировки (escape character), одиночные кавычки и двойные кавычки.
Незамаскированная обратная косая черта (\) является символом маскировки. Он требует использовать следующий за ним символ (за исключением перевода строки) буквально. Если введена пара символов \<перевод строки> и сама обратная косая не замаскирована, эта пара обрабатывается как признак продолжения строки (т.е. она удаляется из входного потока и, по сути, игнорируется).
Все символы в одиночных кавычках используются буквально. Символ одиночной кавычки (апостроф) не должен указываться между одиночными кавычками, даже если он предваряется обратной косой.
Символы в двойных кавычках используются буквально, за исключением символов $, ` и \. Символы $ и ` в двойных кавычках имеют то же специальное значение. Обратная косая имеет специальное значение только если после нее идет один из следующих символов: $, `, ", \ или <перевод строки>. Двойную кавычку можно указывать в двойных кавычках, замаскировав обратной косой.
Специальные параметры * и @ имеют специальное значение при указании в двойных кавычках (см. раздел "ПАРАМЕТРЫ" ниже).
Слова вида $'строка' обрабатываются особым образомy. Слово заменяется строкой, в которой предваренные обратной косой символы заменяются в соответствии со стандартом ANSI C. Управляющие последовательности, начинающиеся с обратной косой, декодируются следующим образом:
\a | тревога (звонок) |
\b | забой |
\e | управляющий символ |
\f | прогон страницы (form feed) |
\n | перевод строки (new line) |
\r | carriage return (возврат каретки) |
\t | табуляция |
\v | вертикальная табудяция |
\\ | обратная косая |
\nnn | символ, ASCII-код которого совпадает с восьмеричным значением nnn (от одной до трех цифр) |
\xnnn | символ, ASCII-код которого совпадает с шестнадцатеричным значением nnn (от одной до трех цифр) |
Преобразованный результат помещается в одиночные кавычки, как если бы символа доллара просто не было.
Строка в двойных кавычках, перед которой идет символ доллара ($), будет преобразована в соответствии с текущей локалью. Если текущая локаль - C или POSIX, символ доллара игнорируется. Если строка преобразована и заменена, результат помещается в двойные кавычки.
Параметр - это сущность, хранящая значение. Это может быть имя, число или один из специальных символов, перечисленных ниже в разделе "Специальные параметры". В контексте интерпретатора, переменная - это параметр, обозначаемый именем.
Параметр устанавливается, если ему присвоено значение. Пустая строка является допустимым значением. После того, как переменная установлена, она может быть удалена только с помощью встроенной команды unset (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).
Значение переменной может быть присвоено с помощью оператора вида
Если значение не задано, переменной присваивается пустая строка. Во всех значениях выполняется замена тильды, подстановка значений параметров и переменных, обработка строк, подстановка результатов выполнения команд, арифметические вычисления и удаление символов маскировки (см. раздел "ОБРАБОТКА" ниже). Если для переменной установлен атрибут целочисленная (integer) (см. declare в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже), ее значение арифметически вычисляется, даже если арифметическое вычисление $((...)) не указано явно (см. подраздел "Арифметическое вычисление" ниже). Разбиение на слова не выполняется, за исключением значения "$@", как объяснено ниже в подразделе "Специальные параметры". Подстановка имен файлов не выполняется.
Позиционный параметр - это параметр, обозначаемый одной или несколькими цифрами, кроме цифры 0. Позиционным параметрам значения присваиваются на основе аргументов, переданных при вызове командного интерпретатора, и могут быть переприсвоены с помощью встроенной команды set. Позиционным параметрам нельзя присваивать значения с помощью операторов присваивания. Позиционные параметры временно заменяются при выполнении функции командного интерпретатора (см. раздел "ФУНКЦИИ" ниже).
Когда позиционный параметр состоит из нескольких цифр, его надо брать в скобки (см. раздел "ОБРАБОТКА" ниже).
Командный интерпретатор обрабатывает ряд параметров специальным образом. Можно только ссылаться на значения этих параметров - присваивания им не разрешены.
* | Заменяется позиционными параметрами, начиная с первого. Когда такая замена выполняется в двойных кавычках, результат будет одним словом, в котором значения параметров разделены первым символом значения специальной переменной IFS. То есть, "$*" эквивалентно "$1c$2c...", где c - первый символ значения переменной IFS. Если переменная IFS не установлена, значения параметров разделяются пробелами. Если переменная IFS имеет пустое значение, значения параметров просто конкатенируются, без разделителей. |
@ | Заменяется позиционными параметрами, начиная с первого. Когда такая замена выполняется в двойных кавычках, каждый параметр заменяется отдельным словом. То есть, "$@" эквивалентно "$1" "$2" ... Когда позиционных параметров нет, "$@" и $@ заменяются пустой строкой (т.е. они просто удаляются). |
# | Заменяется десятичным значением количества позиционных параметров. |
? | Заменяется статусом последнего выполненного в приоритетном режиме конвейера. |
- | Заменяется флагами текущих опций, заданных при вызове, с помощью встроенной команды set или установленных самим командным интерпретатором (как, например, опция -i). |
$ | Заменяется идентификатором процесса командного интерпретатора. В порожденном командном интерпретаторе, запущенном с помощью (), заменяется идентификатором процесса основного интерпретатора, а не порожденного. |
! | Заменяется идентификатором последнего процесса, запущенного в фоновом (асинхронном) режиме. |
0 | Заменяется именем командного интерпретатора или сценария. Это значение устанавливается при инициализации командного интерпретатора. Если bash вызван с командным файлом, $0 будет установлен равным имени этого файла. Если bash запущен с опцией -c, $0 получает значение первого аргумента после строки, которую надо выполнить, если он задан. В противном случае, этот специальный параметр получает значение имени файла, использованного для вызова bash, которое задается нулевым аргументом. |
_ | При запуске командного интерпретатора устанавливается равным полному имени файла (absolute file name) командного интерпретатора или выполняемого сценария, переданного в списке аргументов. В последствии, заменяется последним аргументом предыдущей команды, с учетом всех замен. Также устанавливается равным полному имени файла каждой выполняемой внешней команды и помещается в среду, экспортируемую для этой команды. При проверке почты этот параметр содержит имя проверяемого файла почты. |
Командный интерпретатор устанавливает следующие переменные:
PPID | Идентификатор родительского процесса для командного интерпретатора. Эта переменная доступна только для чтения. | ||||||||||||
PWD | Текущий рабочий каталог, установленный с помощью команды cd. | ||||||||||||
OLDPWD | Предыдущий рабочий каталог, который был установлен с помощью команды cd. | ||||||||||||
REPLY | Устанавливается равной значению, прочитанному встроенной командой read, при вызове ее без аргументов. | ||||||||||||
UID | Идентификатор текущего пользователя - устанавливается при запуске командного интерпретатора. Эта переменная доступна только для чтения. | ||||||||||||
EUID | Эффективный идентификатор текущего пользователя - устанавливается при запуске командного интерпретатора. Эта переменная доступна только для чтения. | ||||||||||||
GROUPS | Переменная-массив, содержащая список групп, в которые входит текущий пользователь. Эта переменная доступна только для чтения. | ||||||||||||
BASH | Полное имя файла, использованное для вызова данного экземпляра bash. | ||||||||||||
BASH_VERSION | Строка, описывающая версию данного экземпляра bash. | ||||||||||||
BASH_VERSINFO |
Доступный только для чтения массив, элементы которого содержат информацию
о версии для данного экземпляра bash. Элементы массива имеют следующие
значения:
| ||||||||||||
SHLVL | Увеличивается на 1 при каждом запуске порожденного интерпретатора bash. | ||||||||||||
RANDOM | При каждом обращении к этому параметру генерируется случайное число от 0 до 32767. Конкретная последовательность случайных чисел может быть проинициализирована путем присваивания значения переменной RANDOM. Если переменная RANDOM удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается. | ||||||||||||
SECONDS | При каждом обращении к этому параметру возвращается количество секунд, прошедших с момента вызова данного командного интерпретатора. Если переменной SECONDS присваивается значение, при последующем обращении будет получено количество секунд, прошедшее с момента присваивания, плюс присвоенное значение. Если переменная SECONDS удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается. | ||||||||||||
LINENO | При каждом обращении к этому параметру командный интерпретатор подставляет десятичное число, представляющее порядковый номер текущей строки (начиная с 1) в сценарии или функции. При вызове не из сценария или функции, не гарантируется подстановка осмысленного значения. Если переменная LINENO удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается. | ||||||||||||
HISTCMD | Исторический номер команды, или индекс текущей команды в списке выполненных команд. Если переменная HISTCMD удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается. | ||||||||||||
DIRSTACK | Переменная-массив (см. раздел "Массивы" далее), в которой хранится текущее содержимое стека каталогов. Каталоги находятся в стеке в том же порядке, в котором выдаются встроенной командой dirs. Путем присваивания элементам этого массива можно изменять каталоги, уже находящиеся в стеке, но для добавления и удаления каталогов надо использовать встроенные команды pushd и popd. Присваивание значения этой переменной не меняет текущий каталог. Если переменная DIRSTACK удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается. | ||||||||||||
PIPESTATUS | Переменная-массив (см. раздел "Массивы" далее), содержащая список значений статусов выхода процессов в последнем выполненном в приоритетном режиме конвейере (который может состоять и всего из одной команды). | ||||||||||||
OPTARG | Значение последнего аргумента-опции, обработанного встроенной командной getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). | ||||||||||||
OPTIND | Индекс следующего аргумента, который должен быть обработан встроенной командой getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). | ||||||||||||
HOSTNAME | Автоматически устанавливается равной имени текущего хоста. | ||||||||||||
HOSTTYPE | Автоматически устанавливается равной строке, уникально описывающей тип машины, на которой выполняется bash. Стандартное значение зависит от системы. | ||||||||||||
OSTYPE | Автоматически устанавливается равной строке, описывающей операционную систему, на которой выполняется командный интерпретатор bash. Стандартное значение зависит от системы. | ||||||||||||
MACHTYPE | Автоматически устанавливается равной строке, полностью описывающей тип системы, на которой выполняется bash, в стандартном для GNU формате процессор-компания-система. Стандартное значение зависит от системы. | ||||||||||||
SHELLOPTS | Список установленных опций командного интерпретатора через двоеточие. Каждое слово в списке - допустимый аргумент для опции -o встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Опции, упоминающиеся в списке SHELLOPTS, совпадают с выдаваемыми как установленные командой set -o. Если эта переменная экспортирована в среду при запуске командного интерпретатора bash, все упомянутые в списке опции будут установлены до чтения любых файлов начального запуска. Эта перменная доступна только для чтения. |
Следующие переменные используются командным интерпретатором. В некоторых случаях bash присваивает переменным стандартные значения; эти случаи указаны ниже.
IFS | Внутренний разделитель полей (Internal Field Separator), используемый для выделения слов после всех подстановок и для разбиения на слова строк, прочитанных с помощью встроенной команды read. Стандартное значение - "<пробел><табуляция><перевод строки>". | ||||||||||
PATH | Путь поиска команд. Это список каталогов через двоеточие, в которых командный интерпретатор ищет команды (см. раздел "ВЫПОЛНЕНИЕ КОМАНД" ниже). Стандартный путь поиска зависит от системы и задается администратором, устанавливающим bash. Типичное значение: "/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.". | ||||||||||
HOME | Начальный каталог текущего пользователя; стандартный аргумент для встроенной команды cd. Значение этой переменной также используется при замене тильды. | ||||||||||
CDPATH | Путь поиска для команды cd. Это список каталогов через двоеточие, в которых командный интерпретатор ищет целевые каталоги, указанные по имени в команде cd. Пример возможного значения - ".:~:/usr". | ||||||||||
BASH_ENV | Если этот параметр установлен при выполнении командным интерпретатором bash сценария, его значение интерпретируется как имя файла, содержащего команды инициализации интерпретатора, аналогично ~/.bashrc. В значении BASH_ENV перед интерпретацией выполняется подстановка значений параметров, подстановка результатов выполнения команд и арифметические вычисления. Переменная PATH не используется для поиска результирующего имени файла. | ||||||||||
Если этот параметр установлен равным имени файла и не установлена переменная MAILPATH, bash информирует пользователя о получении электронной почты в указанный файл. | |||||||||||
MAILCHECK | Задает частоту проверки (в секундах) электронной почты командным интерпретатором bash. Стандартное значение - 60 секунд. Когда приходит время проверять наличие новой почты, командный интерпретатор делает это перед выдачей первичного приглашения. Если эта переменная не установлена, проверка почты командным интерпретатором отключается. | ||||||||||
MAILPATH |
Список имен файлов через двоеточие, в которых нужно проверять наличие
новых почтовых сообщений. Можно задавать сообщение, которое должно
выдаваться при поступлении почты в конкретный файл, отделяя сообщение от
имени файла вопросительным знаком (?). В тексте этого
сообщения метасимвол $_ заменяется именем текущего файла почты. Например: MAILPATH='/usr/spool/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"' Командный интерпретатор bash поддерживает стандартное значение для этой переменной, но используемое при этом местонахождение файлов почты пользователя зависит от системы (например, /usr/spool/mail/$USER). | ||||||||||
PS1 | Значение этого параметра обрабатывается (см. раздел "ПРИГЛАШЕНИЯ" ниже) и используется для установки строки первичного приглашения. Стандартное значение - "\s-\v\$ ". | ||||||||||
PS2 | Значение этого параметра обрабатывается, как и PS1, и используется для установки строки вторичного приглашения. Стандартное значение - "> ". | ||||||||||
PS3 | Значение этого параметра используется в качестве приглашения для команды select (см. раздел "СИНТАКСИС КОМАНД" выше). | ||||||||||
PS4 | Значение этого параметра обрабатывается, как и PS1, и выдается перед каждой командой, показываемой интерпретатором bash в ходе трассировки выполнения. Первый символ PS4 повторяется необходимое количество раз, показывая уровень вложенности. Стандартное значение - "+". | ||||||||||
TIMEFORMAT |
Значение этого параметра используется в качестве строки, задающей формат
выдачи информации о времени выполнения для конвейеров, перед которыми
задано зарезервированное слово time. Символ % начинает управляющую
последовательность, заменяемую значением времени или другой информацией.
Управляющие последовательности имеют следующие значения (в квадратных
скобках представлены необязательные части):
Необязательный параметр l задает длинный формат, включая минуты, в виде MMmSS.FFs. Значение праметра p определяет, включаются доли секунды или нет. Если эта переменная не установлена, bash действует так, как если бы она имела значение $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS'. Если установлено пустое значение, информация о времени выполнения не выдается. При выводе строки по формату добавляется перевод строки. | ||||||||||
HISTSIZE | Количество команд, которые необходимо запоминать в списке истории (см. раздел "ИСТОРИЯ КОМАНД" ниже). Стандартное значение - 500. | ||||||||||
HISTFILE | Имя файла, в котором сохраняется история команд (см. раздел "ИСТОРИЯ КОМАНД" ниже). Стандартное значение - ~/.bash_history. Если эта переменная не установлена, история команд не сохраняется при завершении работы интерактивного командного интерпретатора. | ||||||||||
HISTFILESIZE | Максимальное количество строк, содержащееся в файле истории. Если этой переменной присвоено значение, файл истории, при необходимости, усекается, и будет содержать не больше, чем указанное количество строк. Стандартное значение - 500. Файл истории также усекается до этого размера после записи при выходе из интерактивного командного интерпретатора. | ||||||||||
OPTERR | Если имеет значение 1, bash показывает сообщения об ошибках, выдаваемые встроенной командой getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Переменная OPTERR инициализируется значением 1 при каждом вызове командного интерпретатора или выполнении сценария. | ||||||||||
LANG | Используется для определения локали для всех категорий, не заданных явно с помощью переменной, имя которой начинается с LC_. | ||||||||||
LC_ALL | Эта переменная переопределяет значение переменной LANG и всех остальных переменных LC_, задающих категорию локали. | ||||||||||
LC_COLLATE | Эта переменная задает порядок сортировки, используемый при сортировке полученных по шаблону имен файлов, и определяет интерпретацию диапазонов, классов эквивалентостей и правила сравнения символов для подстановки имен файлов и сопоставления с образцом. | ||||||||||
LC_CTYPE | Эта переменная определяет интерпретацию символов и принадлежность символов к определенному классу для подстановки имен файлов и сопоставления с образцом. | ||||||||||
LC_MESSAGES | Эта переменная определяет локаль, используемую для обработки строк в двойных кавычках, перед которыми указан символ $. | ||||||||||
PROMPT_COMMAND | Если значение задано, оно выполняется как команда перед выдачей каждого первичного приглашения. | ||||||||||
IGNOREEOF | Управляет действием командного интерпретатора при получении символа конца файла (EOF) как единственного символа в строке. Если эта переменная установлена, ее значение интерпретируется как количество подряд идущих символов EOF, с которых должна начинаться строка, чтобы в результате работа командного интерпретатора bash завершилась. Если переменная существует, но не имеет числового значения или не имеет значения вообще, по умолчанию используется значение 10. Если эта переменная не существует, EOF означает конец входных данных для командного интерпретатора. | ||||||||||
TMOUT | Если установлено значение больше нуля, оно интерпретируется как количество секунд ожидания ввода после выдачи первичного приглашения. Командный интерпретатор bash завершает работу по истечении этого времени, если не введена команда. | ||||||||||
FCEDIT | Задает стандартный редактор для встроенной команды fc. | ||||||||||
FIGNORE | Список суффиксов через двоеточие, которые необходимо игнорировать при завершении имен файлов (см. раздел "БИБЛИОТЕКА READLINE" ниже). Имя файла, суффикс которого совпадает с одним из указанных в FIGNORE значений, исключается из списка соответствующих имен файлов. Пример значения - ".o:~". | ||||||||||
GLOBIGNORE | Список шаблонов через двоеточие, задающих набор имен файлов, которые надо игнорировать при подстановке имен. Если имя файла, соответствующее шаблону, также соответствует одному из шаблонов в GLOBIGNORE, оно удаляется из списка соответствующих. | ||||||||||
INPUTRC | Имя файла начального запуска readline, переопределяющего стандартные установки в файле ~/.inputrc (см. раздел "БИБЛИОТЕКА READLINE" ниже). | ||||||||||
HISTCONTROL | Если имеет значение ignorespace, строки, начинающиеся символом пробела, не попадают в список выполненных команд. Если имеет значение ignoredups, строки, совпадающие с последней выполненной командой, в список выполненных команд не попадают. Значение ignoreboth сочетает действие обеих представленных опций. Если переменной нет или она имеет какое-то другое значение, кроме перечисленных выше, все строки, прочитанные синтаксическим анализатором, сохраняются в списке истории, с учетом значения переменной HISTIGNORE. Действие этой переменной переопределяется переменной HISTIGNORE. Вторая и следующие строки многострочной составной команды не проверяются, и добавляются в список истории независимо от значения HISTCONTROL. | ||||||||||
HISTIGNORE | Список шаблонов через двоеточие, используемых для принятия решения о сохранении командных строк в списке истории. Каждый шаблон привязывается к началу строки и должен задавать всю строку ('*' неявно не добавляется). Каждый шаблон сравнивается со строкой после проверок, задаваемых переменной HISTCONTROL. Кроме обычных символов сопоставления с образцом в командном интерпретаторе, символ '&' сопоставляется с предыдущей строкой в списке истории. Символ '&' можно экранировать с помощью обратной косой. Перед сопоставлением обратная косая убирается. Вторая и последующая строки составной многострочной команды не проверяются и добавляются в список истории независимо от значения переменной HISTIGNORE. | ||||||||||
histchars | Два или три символа, управляющих подстановкой и разбиением на лексемы уже выполненных команд (см. раздел "ПОДСТАНОВКА КОМАНД ИЗ СПИСКА ВЫПОЛНЕННЫХ" ниже). Первый символ - это символ подстановки из списка, который означает начало работы со списком истории. Обычно это символ '!'. Второй символ - это символ быстрой подстановки, используемый для быстрого повторения предыдущей введенной команды, с подстановкой указанной строки вместо другой, заданной в этой команде. По умолчанию используется символ '^'. Необязательный третий символ - это символ, указывающий, если является первым символом слова, что остаток строки - это комментарий. Обычно в этом качестве используется символ '#'. Символ комментария для списка истории приводит к отказу от подстановки из истории для оставшихся слов в командной строке. Он не обязательно приводит к обработке синтаксическим анализатором оставшейся части строки как комментария. | ||||||||||
HOSTFILE | Содержит имя файла того же формата, что и файл /etc/hosts, который будет читаться при необходимости подстановки имени хоста. Этот файл можно менять интерактивно; при следующей попытке подстановки имени хоста bash добавит содержимое нового файла к уже существующей базе данных. | ||||||||||
auto_resume | Эта переменная управляет взаимодействием командного интерпретатора с пользователем и средствами управления заданиями. Если она установлена, простые команды из одного слова и без перенаправлений рассматриваются как указатели возможного возобновления существующих остановленных заданий. Неоднозначность не допускается; если с введенной строки начинается более одного задания, выбирается последнее по времени приостановки задание. Имя остановленного задания, в этом контексте, - это командная строка, использовавшаяся для его запуска. Если эта переменная имеет значение exact, введенная строка должна точно совпадать с именем остановленного задания; Если же задано значение substring, введенная строка должна быть подстрокой имени остановленного задания. Это аналогично по возможностям идентификатору задания %? (см. раздел "УПРАВЛЕНИЕ ЗАДАНИЯМИ" ниже). Если установлено любое другое значение, введенная строка должна быть префиксом имени остановленного задания; это аналогично по возможностям идентификатору задания %. |
Командный интерпретатор bash поддерживает одномерные массивы. Любая переменная может использоваться как массив; встроенная процедура declare позволяет объявить массив явно. Нет ограничения на рамер массива или требования непрерывности индексов. Массивы индексируются целыми числами, начиная с нуля.
Массив создается автоматически при присваивании любой переменной значения с помощью конструкции имя[индекс]=значение. Индекс обрабатывается как арифметическое выражение, которое должно иметь неотрицательное значение. Для явного объявления массива используется команда declare -a имя (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Конструкция declare -a имя[индекс] также поддерживается; индекс просто игнорируется. Для переменной типа массив можно задать атрибуты с помощью встроенных команд declare и readonly. Атрибут применяется ко всем элементам массива.
Присваивания массивам выполняются с помощью конструкций вида имя=(значение1 ... значениеn), где каждое значение имеет вид [индекс]=строка. Обязательно задавать только строку. Если необязательные квадратные скобки и индекс указаны, присваивание выполняется элементу с соответствующим индексом; в противном случае, в качестве индекса элемента используется индекс последнего элемента, которому было присвоено значение, плюс один. Индексация начинается с нуля. Эту же конструкцию присваивания можно использовать и во встроенной команде declare. Значения отдельным элементам массива присваиваются с помощью представленной выше конструкции имя[индекс]=значение.
На любой элемент массива можно сослаться с помощью конструкции ${имя[индекс]}. Фигурные скобки необходимы, чтобы избежать конфликтов при подстановке имен файлов. Если в качестве индекса указан символ @ или *, слово заменяется всеми элементами массива с указанным именем. Эти индексы интерпретируются по-разному только если слово указано в двойных кавычках. Если слово указано в двойных кавычках, конструкция ${имя[*]} заменяется одним словом, значение которого строится как значения каждого элемента массива, разделенные первым символом из значения переменной среды IFS, а конструкция ${имя[@]} заменяет каждый элемент массива имя отдельным словом. Когда массив пустой, ${имя[@]} заменяется пустой строкой. Это аналогично замене специальных параметров * и @ (см. подраздел "Специальные параметры" выше). Конструкция ${#имя[индекс]} заменяется длиной элемента ${имя[индекс]}. Если в качестве индекса указан символ * или @, подставляется количество элементов массива. Ссылка на переменную-массив без индекса эквивалентна ссылке на элемент с индексом ноль.
Для уничтожения массивов используется встроенная команда unset. Команда unset имя[индекс] уничтожает элемент массива с указанным индексом. Команда unset name, где name - имя массива, или unset имя[индекс], где индекс - * или @, удаляет весь массив.
Встроенные команды declare, local и readonly воспринимают опцию -a для указания массива. Встроенная команда read воспринимает опцию -a для присваивания массиву списка слов, прочитанных из станадартного входного потока. Встроенные команды set и declare выдают значения массивов так, что их можно повторно использовать в присваиваниях.
Замена выполняется в командной строке после разбиения ее на слова. Выполняется семь видов замен: замена выражений в фигурных скобках, замена тильды, подстановка значений переменных и параметров, подстановка результатов выполнения команд, подстановка значений арифметических выражений, разбиение слов и подстановка имен файлов.
Замена выполняется в следующем порядке: замена выражений в фигурных скобках, замена тильды, подстановка значений переменных, параметров, арифметических выражений и результатов выполнения команд (слева направо), разбиение слов и подстановка имен файлов.
В системах, где это может поддерживаться, выполняется дополнительная замена - подстановка процессов.
Только замена выражений в фигурных скобках, разбиение слов и подстановка имен файлов может изменить количество слов в командной строке; при других заменах одно слово просто заменяется другим. Единственное исключение - подстановка "$@" и "${имя[@]}", как объяснялось выше (см. раздел "ПАРАМЕТРЫ").
Замена выражений в фигурных скобках - это механизм генерации произвольных строк. Он аналогичен подстановке имен файлов, но генерируемые имена не обязательно должны существовать. Шаблоны в фигурных скобках имеют вид необязательного префикса, за которым идет набор строк через запятую в фигурных скобках, после чего - необязательный суффикс. Префикс добавляется в начало каждой строки, содержащейся в фигурных скобках, а затем к каждой полученной так (слева направо) строке добавляется суффикс.
Выражения в фигурных скобках могут быть вложенными. Результаты каждой замены не сортируются; порядок слева направо сохраняется. Например, конструкция a{d,c,b}e заменяется на 'ade ace abe'.
Замена выражений в фигурных скобках выполняется перед любыми другими заменами, и в результате сохраняются все символы, имеющие специальное значение для других замен. Эта замена - строго текстуальная. Командный интерпретатор bash никак не учитывает контекст подстановки или текст в фигурных скобках.
Корректное выражение в фигурных скобках должно содержать незамаскированные открывающую и закрывающую фигурную скобку и, по крайней мере, одну незамаскированную запятую. Любое некорректное выражение в фигурных скобках остается неизменным. Символ { или , может маскироваться обратной косой для предотвращения его интерпретации на этапе замены выражений в фигурных скобках.
Эта конструкция обычно используется для сокращенной записи группы строк с общим префиксом, более длинным чем в представленном выше примере:
Если слово начинается незамаскированным символом тильда (~), все символы до первой незамаскированной косой черты (или все символы, если незамаскированной косой черты в слове нет) считаются тильда-префиксом. Если ни один из символов тильда-префикса не замаскирован, его символы после тильды рассматриваются как возможное регистрационное имя. Если это регистрационное имя представляет собой пустую строку, тильда заменяется значением переменной HOME. Если переменная HOME не установлена, подставляется начальный каталог пользователя, выполняющего процесс командного интерпретатора. Если же тильда-префикс не пустой, подставляется начальный каталог соответствующего пользователя.
Если тильда-префикс имеет вид ~+, вместо него подставляется значение переменной PWD. Если тильда-префикс имеет вид ~-, вместо него подставляется значение переменной OLDPWD, если эта переменная установлена. Если среди символов после тильды в тильда-префиксе имеется число N, с необязательными префиксами + или -, тильда-префикс заменяется соответствующим элементом из стека каталогов, который был бы выдан встроенной командой dirs при вызове с тильда-префиксом в качестве аргумента. Если символы после тильды содержат число без начального знака + или -, предполагается +.
Если соответствующего регистрационного имени не существует или замену тиильды выполнить не удалось, исходное слово остается без изменений.
Присваивания значений переменным проверяются на наличие незамаскированных тильда-префиксов сразу после : или =. В этих случаях также выполняется замена тильды. Соответственно, можно использовать имена файлов с тильдами в присваиваниях переменным PATH, MAILPATH и CDPATH, и командный интерпретатор выполнит необходимые замены.
Символ $ обозначает подстановку значений параметров, подстановку реультатов выполнения команд или подстановку значений арифметических выражений. Имя параметра можно брать в фигурные скобки, что позволяет отделить его от идущих непосредственно за ним символов, которые не являются частью имени.
При использовании фигурных скобок, завершающей считается первая скобка }, не замаскированная обратной косой, не входящая в строку в кавычках, встроенное арифметическое выражение или подставляемую команду, или в подстановку значения другого параметра.
Если первый символ параметра - восклицательный знак, начинается косвенная подстановка. Командный интерпретатор bash использует значение переменной, имя которой задается остальной частью параметра, в качестве имени переменной, значение которой необходимо подставить, а не собственно значения. Это называется косвенной заменой.
В каждом из описанных ниже случаев в полученном слове выполняется замена тильды, подстановка значений параметров, подстановка результатов выполнения команд и вычисление арифметических выражений. Если не выполняется подстановка подстрок, bash проверяет, не является ли параметр не установленным или не имеет ли он пустого значения; если не указать двоеточие, проверяется только, установлен ли параметр.
Подстановка результатов выполнения команд позволяет результат, выдаваемый командой в стандартный выходной поток, подставить вместо имени команды. Имеется две формы такой подстановки:
Командный интерпретатор bash делает эту подстановку путем выполнения команды и замены конструкции подстановки содержимым стандартного выходного потока команды, из которого удалены завершающие переводы строк. Встроенные переводы строк не удаляются, но они могут быть удалены при разбиении на слова. Подстановку результатов выполнения команды $(cat file) можно заменить эквивалентной, но более быстрой: $(< file).
При использовании старой формы подстановки в обратных апострофах обратная косая интерпретируется как литерал, если только после нее не идут символы $, ` или \. Первый же обратный апостроф, не замаскированный обратной косой, завершает подставляемую команду. При использовании формы $(команда) все символы между круглыми скобками образуют команду - ни один не имеет специального значения.
Подстановка результатов выполнения команд может быть вложенной. Для задания вложенной подстановки в форме с обратными апострофами замаскируйте внутренние обратные апострофы обратными косыми.
Если подстановка задана в двойных кавычках, разбиение на слова и подстановка имен файлов в результатах не выполняется.
При вычислении арифметических выражений вместо выражения подставляется результат его вычисления. Для вычисления арифметических выражений используется следующий формат:
Выражение обрабатывается так, как если бы оно было взято в двойные кавычки, но двойные кавычки в самом выражении не имеют специального значения. Во всех лексемах выражения выполняется подстановка значений параметров, подстановка строк, подстановка результатов выполнения команд и удаление кавычек. Вычисления арифметических выражений могут быть вложенными.
Вычисление выполняется по правилам, перечисленным ниже в разделе "ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ". Если выражение недопустимо, командный интерпретатор bash выдает сообщение о невозможности вычисления и подстановка не выполняется.
Подстановка процессов доступна в системах, поддерживающих именованные каналы (FIFO) или метод именования открытых файлов через /dev/fd. Она имеет вид <(список) или >(список). Процесс список запускается и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в /dev/fd. Имя этого файла передается в качестве аргумента текущей команде как результат подстановки. Если использована форма >(список), запись в файл будет давать входные данные процессу список. Если же использована форма <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.
Если подстановка процессов поддерживается, она выполняется одновременно с подстановкой значений параметров, подстановкой результатов выполнения команд и вычислением арифметических выражений.
Командный интерпретатор обрабатывает результаты подстановки значений параметров, результатов выполнения команд и арифметических вычислений, не взятых в двойные кавычки, разбивая их на слова.
Командный интерпретатор рассматривает каждый символ значения переменной IFS как разделитель и разбивает результаты подстановок на слова по этим символам. Если переменная IFS не установлена или ее значение - <пробел><табуляция><перевод строки>, т.е. стандартное, то любая последовательность подряд идущих символов из IFS считается разделителем слов. Если же переменная IFS имеет значение, отличающееся от стандартного, то последовательность пробельных символов (пробелов и символов табуляции) в начале и в конце слова игнорируется, если пробельные символы входят в значение IFS (их обобщенно называют пробельным символом IFS). Любые символы в значении IFS, не являющиеся пробельными, вместе с любыми идущими за ними пробельными символами IFS, ограничивают слово. Последовательность пробельных символов IFS также считается разделителем. Если переменная IFS имеет пустое значение, разбиение на слова не происходит.
Явные пустые строки ("" или '') оставляются. Не взятые в кавычки неявные пустые строки, получающиеся в результате подстановки параметров, не имеющих значения, удаляются. Если параметр, не имеющий значения, подставляется в двойных кавычках, получается пустая строка, и она остается в командной строке.
Учтите, что если не было подстановок, то и разбиение на слова не выполняется.
После разбиения на слова, если только не установлена опция -f, командный интерпретатор bash просматривает каждое слово в поисках символов *, ?, ( и [. Если найден любой из этих символов, слово считается шаблоном и заменяется упорядоченным по алфавиту списком имен файлов, соответствующих шаблону. Если соответствующие имена файлов не найдены и опция командного интерпретатора nullglob отключена, слово остается без изменений. Если опция nullglob установлена и соответствующие файлы не найдены, слово удаляется. Если включена опция командного интерпретатора nocaseglob, сопоставление выполняется без учета регистра алфавитных символов. Если шаблон используется для подстановки имен файлов, символ "." в начале имени или сразу после косой черты должен сопоставляться явно, если только не установлена опция интерпретатора dotglob. При сопоставлении имен файлов косые черты всегда должны сопоставляться явно. В других случаях символ "." обрабатывается как любые другие символы. См. описание опций командного интерпретатора nocaseglob, nullglob и dotglob ниже в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА".
Переменная командного интерпретатора GLOBIGNORE может использоваться для ограничения множества имен файлов, соответствующих шаблону. Если переменная GLOBIGNORE установлена, каждое сопоставившееся имя файла, соответствующее также одному из шаблонов, заданных в GLOBIGNORE, удаляется из списка сопоставившихся. Имена файлов "." и ".." игнорируются всегда, даже если установлена переменная GLOBIGNORE. Однако при установке переменной GLOBIGNORE автоматически устанавливается опция интерпретатора dotglob, так что все остальные имена файлов, начинающиеся с ".", будут подставлены. Для получения старого поведения - игнорирования имен файлов, начинающихся с ".", - задайте ".*" как один из шаблонов в переменной GLOBIGNORE. Опция dotglob отключается, если переменная GLOBIGNORE не установлена.
Любой символ в шаблоне, отличающийся от специальных, описанных ниже, сопоставляется буквально. Символ NUL в шаблоне указывать нельзя. Специальные символы шаблона для буквального сопоставления необходимо маскировать.
Специальные символы шаблона имеют следующие значения:
В квадратных скобках можно задавать классы символов с помощью конструкции
[:класс:], где класс - один из следующих классов, определяемых стандартом
POSIX.2:
alnum alpha ascii blank cntrl digit graph lower print
punct space upper xdigit
Класс символов сопоставляется с любым символом, принадлежащим к этому классу.
В квадратных скобках можно задавать класс эквивалентности с помощью конструкции [=c=], соответствующей всем символам с тем же порядком сортировки (collation weight), определяемым текущей локалью, что и символ c.
В квадратных скобках конструкция [.символ.] соответствует символу с указанным порядком сортировки.
Если с помощью встроенной команды shopt установлена опция командного интерпретатора extglob, распознается ряд дополнительных операторов сопоставления с образцом. В следующем описании список_шаблонов - это список из одного или нескольких шаблонов через вертикальную черту (|). Составные шаблоны можно формировать из одного или нескольких следующих подшаблонов:
После выполнения всех перечисленных выше подстановок все незамаскированные вхождения символов \, ' и ", не являющиеся результатом этих подстановок, удаляются.
Перед выполнением команды ее входной и выходной потоки могут быть перенаправлены с помощью специальных конструкций, обрабатываемых командным интерпретатором. Перенаправления также можно использовать для открытия и закрытия файлов в текущей среде работы командного интерпретатора. Следующие операторы перенаправления могут предшествовать простой команде или указываться в любом ее месте, или указываться после команды. Перенаправления обрабатываются в порядке их указания, слева направо.
В следующих описаниях если номер дескриптора файла не указан и первый символ оператора перенаправления - <, выполняется перенаправление стандартного входного потока (дескриптор файла 0). Если же первым символом оператора перенаправления является символ >, выполняется перенаправление стандартного выходного потока (дескриптор файла 1).
В слове, идущем за оператором перенаправления в следующих описаниях, если не сказано иначе, выполняется подстановка фигурных скобок, замена тильды, подстановка значений параметров, подстановка результатов выполнения команд, вычисление арифметических выражений, удаление кавычек и подстановка имен файлов. Если в результате получается более одного слова, командный интерпретатор bash выдает сообщение об ошибке.
Учтите, что порядок указания перенаправлений имеет значение. Например, команда
перенаправляет в файл dirlist стандартный выходной поток и стандартный поток ошибок, тогда как команда
перенаправляет в файл dirlist только стандартный выходной поток, поскольку стандартный поток ошибок был направлен туде же, куда и стандартный выходной поток до его перенаправления в файл dirlist.
Ошибка при открытии или создании файла приводит к отмене перенаправления.
Перенаправление входного потока приводит к открытию на чтение файла, имя которого получается в результате подстановок в слове, через дескриптор файла n, или как стандартного входного потока (дескриптор файла 0), если n не указано.
В общем случае перенаправление входного потока имеет вид:
Перенаправление входного потока приводит к открытию на запись файла, имя которого получается в результате подстановок в слове, через дескриптор файла n, или как стандартного выходного потока (дескриптор файла 1), если n не указано. Если файл не существует, он создается; если существует - он усекается до нулевого размера.
В общем случае перенаправление выходного потока имеет вид:
Если используется оператор перенаправления > и с помощью встроенной команды set установлена опция noclobber, перенаправление не будет выполнено, если файл с соответствующим именем существует и является обычным файлом. Если используется оператор перенаправления >|, либо оператор перенаправления - > и опция noclobber с помощью встроенной команды set не установлена, перенаправление выполняется, даже если соответствующий файл существует.
Такое перенаправление вывода приводит к открытию файла, имя которого получается в результате подстановок в слове, в режиме добавления через дескриптор файла n, или к добавлению в стандартный выходной поток (дескриптор файла 1) если n не указано. Если файл не существует, он создается.
Перенаправление вывода на добавление имеет следующий общий вид:
Командный интерпретатор bash позволяет перенаправить как стандартный выходной поток (дескриптор файла 1), так и стандартный поток ошибок (дескриптор файла 2) в файл, имя которого получается в результате подстановок в слове.
Для этого предлагается два формата конструкции перенаправления:
Первый формат является предпочтительным. Эта конструкция семантически эквивалентна следующей:
При этом типе перенаправления командный интерпретатор будет читать входные данные из текущего файла, пока не встретится строка, содержащая только указанное слово (без хвостовых пробелов). Все прочитанные до этого строки затем используются как стандартный входной поток для команды.
Конструкция "документ здесь" имеет следующий формат:
<<[-]слово документ-здесь ограничитель
В слове не выполняется подстановка значений параметров, результатов выполнения команд, имен файлов или вычисление арифметических выражений. Если в слове есть замаскированный символ, ограничитель является результатом удаления символов маскировки из слова. Если в слове нет замаскированных символов, во всех строках "документа здесь" выполняется подстановка значений параметров, результатов выполнения команд и вычисление арифметических выражений. В этом случае пара \<перевод строки> игнорируется, и необходимо использовать \ для маскировки символов \, $ и `.
Если в качестве оператора перенаправления используется <<-, то все начальные табуляции из входных строк и строки, содержащей ограничитель, удаляются. Это позволяет естственным образом выравнивать конструкции "документ здесь" в сценариях командного интерпретатора.
Оператор перенаправления
используется для дублирования дескрипторов входных файлов. Если в результате подстановок слово представляет собой одну или несколько цифр, дескриптор файла n становится копией соответствующего дескриптора файла. Если файл с дескриптором, задаваемым цифрами слова, не открыт на чтение, возникает ошибка перенаправления. Если после подстановок в слове получается -, файл с дескриптором n закрывается. Если n не указано, используется стандартный входной поток (дескриптор файла 0).
Оператор
используется аналогично для дублирования дескрипторов выходных файлов. Если n не указано, используется стандартный выходной поток (дескриптор файла 1). Если цифры в слове не задают дескриптор файла, открытого на запись, возникает ошибка перенаправления. В качестве специального случая, если n не указано и слово после подстановок не представляет собой одну или несколько цифр, стандартный выходной поток и стандартный поток ошибок перенаправляются так, как было описано выше.
Оператор перенаправления
вызывает открытие файла, имя которого получается в результате подстановок в слове, для чтения и записи через дескриптор файла n или через дескриптор файла 0, если n не указано. Если файл не существует, он создается.
Псеводнимы позволяют подставлять вместо первого слова простой команды строку. Командный интерпретатор поддерживает список псевдонимов, которые можно устанавливать и удалять с помощью встроенных команд alias и unalias (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Первое слово каждой команды, если оно не взято в кавычки, ищется в списке псевдонимов. Если соответствующий псевдоним найден, слово заменяется текстом псевдонима. Имя псевдонима и подставляемый текст может включать любые допустимые входные данные для командного интерпретатора, включая перечисленные ранее метасимволы. Единственное исключение - имя псевдонима не может содержать знак =. Первое слово текста псевдонима также ищется в списке псевдонимов, но если оно совпадает с именем подставляемого псевдонима, повторной подстановки не происходит. Это означает, что можно задать псевдоним ls для ls -F, например, и bash не будет пытаться выполнять рекурсивные подстановки в тексте псевдонима. Если последний символ текста псевдонима - пробел, следующее за псевдонимом слово исходной команды также ищется в списке псевдонимов и, если найдено, заменяется.
Псевдонимы создаются и просматриваются с помощью комадны alias, а удаляются с помощью команды unalias.
Нет механизма передачи аргументов в подставляемый текст. Если необходимы аргументы, используйте функцию командного интерпретатора.
Псевдонимы не подставляются, если командный интерпретатор не является интерактивным, если только с помощью встроенной команды shopt не установлена опция expand_aliases (см. описание команды shopt ниже, в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА").
Правила определения и использования псевдонимов несколько запутаны. Командный интерпретатор bash всегда читает по крайней мере одну полную строку ввода, прежде чем выполнять любые указанные в ней команды. Псевдонимы подставляются при чтении строки, а не при ее выполнении. Поэтому определение псевдонима, заданное в одной строке с другой командой, не учитывается, пока не будет прочитана следующая строка. Команды, идущие после определения псевдонима в той же строке, этот новый псевдоним не учитывают. Это поведение также необходимо учитывать при выполнении функций. Псевдонимы подставляются при чтении определения функции, а не при ее выполнении, поскольку определение функции само является составной командой. Как следствие, псевдонимы, определенные в функции, не доступны до тех пор, пока функция не выполнится. Для простоты, всегда задавайте определения псевдонимов в отдельной строке и не используйте команду alias в составных командах.
Практически все варианты использования псевдонимов покрываются функциями командного интерпретатора.
Функция командного интерпретатора, определенная как было представлено ранее в разделе "СИНТАКСИС КОМАНД", сохраняет под заданным именем последовательность команд для выполнения в дальнейшем. Функции выполняются в контексте текущего командного интерпретатора; для их интерпретации не создается новый процесс (сравните с выполнением сценария командного интерпретатора). При вызове функции ее аргументы становятся позиционными параметрами. Специальный параметр # обновляется, отражая это изменение. Позиционный параметр 0 не изменяется. Все остальные особенности среды выполнения командного интерпретатора у функции и вызывающей ее команды идентичны, только обработчик сигнала DEBUG (см. описание встроенной команды trap в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже) не наследуется.
Можно объявлять локальные переменные функции с помощью встроенной команды local. Обычно переменные и их значения совместно используются функцией и вызвавшей ее командой.
Если в функции выполняется встроенная команда return, эта функция завершается, и выполнение продолжается со следующей команды после вызова функции. Когда функция завершается, восстанавливаются значения позиционных параметров и специального параметра #, которые были до выполнения функции.
Имена и определения функций можно получить с помощью опции -f встроенных команд declare или typeset. С опцией -F встроенные команды declare и typeset будут выдавать только имена функций. Функции можно экспортировать, с помощью опции -f встроенной команды export, так что они будут автоматически определены в порожденных командных интерпретаторах.
Функции могут быть рекурсивными. Глубина рекурсии не ограничена.
Командный интерпретатор в определенных случаях обеспечивает вычисление арифметических выражений (см. встроенную команду let и подраздел "Подстановка арифметических выражений" ранее). Вычисление выполняется в длинных целых числах без проверки переполнения, хотя деление на 0 перехватывается и выдается соответствующее сообщение об ошибке. Операторы в следующем списке сгруппированы по уровням с одинаковым приоритетом. Уровни перечислены в порядке убывания приоритета.
В качестве операндов можно использовать переменные командного интерпретатора; перед вычислением выполняется подстановка значений параметров. Значение параметра в арифметическом выражении приводится к длинному целому. Чтобы переменную командного интерпретатора можно было использовать в арифметических выражениях, ее атрибут integer устанавливать не обязательно.
Константы с начальным 0 интерпретируются как восьмеричные числа. Начальные 0x или 0X обозначают шестнадцатеричную константу. В остальных случаях числа имеют вид [основание#]n, где основание - десятичное число от 2 до 64, представляющее основание системы счисления, а n - число в этой системе счисления. Если основание не указано, используется основание 10. Цифры, большие 9, представляются строчными буквами, прописными буквами, символами _ и @, именно в таком порядке. Если основание меньше или равно 36, прописные и строчные буквы эквивалентны и используются для представления чисел от 10 до 35.
Операторы вычисляются в порядке приоритетов. Сначала вычисляются подвыражения в круглых скобках, которые позволяют переопределить представленные выше стандартные приоритеты операторов.
Условные выражения используются составной командой [[ и встроенными командами test и [ для проверки атрибутов файла и выполнения строковых и арифметических сравнений. Выражения формируются из следующих унарных и бинарных элементарных условий. Если любой из аргументов файл в одном из условий имеет вид /dev/fd/n, проверяется файл с дескриптором n.
При обработке простой команды командный интерпретатор делает, слева направо, следующие подстановки, присваивания и перенаправления.
Если в результате имени команды нет, присваивания переменным влияют на среду текущего командного интерпретатора. В противном случае, переменные добавляются в среду выполняемой команды и не влияют на среду текущего командного интерпретатора. Если происходит попытка присвоить значение переменной с атрибутом только для чтения, выдается сообщение об ошибке и команда завершается с ненулевым статусом выхода.
Если в результате имени команды нет, перенаправления выполняются, но не влияют на среду текущего командного интерпретатора. При ошибке перенаправления команда завершается с ненулевым статусом выхода.
Если после подстановок имя команды осталось, выполнение продолжается так, как описано ниже. В противном случае, выполнение команды завершается. При этом если выполнялись подстановки результатов выполнения команд, статус выхода будет равен статусу последней команды, результаты которой были подставлены. Если подстановок результатов выполнения команд не было, команда завершается со статусом выхода ноль.
После разбиения команды на слова, если в результате получилась простая команда с необязательным списком аргументов, выполняются следующие действия.
Если имя команды не содержит сиволов косой черты, командный интерпретатор пытается ее найти. Если существует функция командного интерпретатора с таким именем, она вызывается как было описано выше в разделе "ФУНКЦИИ". Если же функции с таким именем нет, командный интерпретатор ищет ее в списке встроенных команд. Если такая встроенная команда есть, она выполняется.
Если имя не является именем функции или именем встроенной команды и не содержит пробелы, командный интерпретатор bash просматривает каждый каталог в значении переменной PATH в поисках выполняемого файла с соответствующим именем. Для запоминания полных имен выполняемых файлов bash использует хэш-таблицу (см. описание команды hash в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее). Полный поиск по каталогам в PATH выполняется только если команда не найдена в этой хэш-таблице. Если команда при таком поиске не найдена, командный интерпретатор выдает соответствующее сообщение и завершает выполнение команды со статусом выхода 127.
Если команда найдена или имя команды содержит косые черты, командный интерпретатор выполняет соответствующую команду в отдельной среде выполнения. Аргумент 0 устанавливается равным имени команды, и ей передаются параметры, соответствующие аргументам в командной строке, если они заданы.
Если выполнить команду не удалось, потому что файл не соответствует поддерживаемым выполняемым форматам, и этот файл не является каталогом, предполагается, что файл является сценарием командного интерпретатора, содержащим его команды. Для его выполнения запускается порожденный командный интерпретатор. Этот порожденный командный интерпретатор переинициализируется, как если бы для обработки сценария был вызван новый командный интерпретатор, но только местонахождения команд, запомненные родительским интерпретатором (см. описание команды hash ниже в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА"), передаются порожденному.
Если текст в файле начинается с #!, остаток первой строки задает интерпретатор для программы. Командный интерпретатор запускает указанный интерпретатор в операционных системах, которые не поддерживают соответствующий формат выполняемого файла непосредственно. Этому интерпретатору в качестве аргументов передается один необязательный аргумент, затем имя интерпретатора из первой строки программы, затем имя самой программы и ее аргументы, если они заданы.
У командного интерпретатора есть среда выполнения, содержащая следующие компоненты:
Когда необходимо выполнить команду, не являющуюся встроенной или функцией командного интерпретатора, она вызывается в отдельной среде выполнения, состоящей из указанных ниже компонентов. Если не указано иначе, все значения наследуются от командного интерпретатора.
Команда, вызванная в этой отдельной среде, не может повлиять на среду выполнения родительского командного интерпретатора.
Команды, результаты которых необходимо подставить, и асинхронные команды вызываются в средах порожденных командных интерпретаторов, которые совпадают со средой родительского, но обработчки сигналов устанавливаются такие, как были унаследованы родительским командным интерпретатором при вызове. Встроенные команды, вызываемые как часть конвейера, также выполняются в среде порожденного командного интерпретатора. Изменения в среде порожденного командного интерпретатора не затрагивают среду выполнения родительского.
При вызове программы ей передается массив строк, который называют средой. Это список пар имя-значение вида name=value.
Командный интерпретатор позволяет манипулировать средой несколькими способами. При вызове командный интерпретатор просматривает свою среду и создает одноименный параметр для каждого имени, автоматически экспортируя его для порожденных процессов. Выполняемые команды наследуют среду. Команды export и declare -x позволяют добавлять и удалять параметры и функции из среды. Если значение параметра, входящего в среду, изменено, новое значение становится частью среды, заменяя старое. Среда, наследуемая выполняемой командой, состоит из начальной среды командного интерпретатора, значения которой могли быть изменены в ходе его работы, за исключением пар, удаленных с помощью команды unset, и новых параметров, добавленных с помощью команд export и declare -x.
Среда для любой простой команды или функции может быть временно дополнена путем задания перед именем присваиваний параметрам, как описано ранее в разделе "ПАРАМЕТРЫ". Эти операторы присваивания влияют только на среду вызываемой команды.
Если установлена опция -k, (см. описание встроенной команды set ниже), то все параметры с присвоенными при вызове значениями, а не только предшествующие имени команды, помещаются в ее среду.
Когда командный интерпретатор bash вызывает внешнюю команду, переменная _ устанавливается равной полному имени файла команды и передается этой команде в среде.
С точки зрения командного интерпретатора, команда, завершившаяся со статусом выхода 0, сработала успешно. Статус выхода 0 означает успешное завершение. Ненулевой статус выхода означает неудачу. Если работа команды прервана сигналом, командный интерпретатор bash использует в качестве статуса выхода значение 128+сигнал.
Если команда не найдена, порожденный для ее выполнения процесс возвращает статус выхода 127. Если команда найдена, но не является выполняемой, возвращается статус выхода 126.
Если команда не сработала, поскольку ошибка произошла при подстановках или перенаправлениях, возвращается положительный статус выхода.
Встроенные команды интерпретатора возвращают статус 0 (истина) при успешном выполнении, и ненулевой статус (ложь), если при выполнении произошла ошибка. При некорректном использовании все встроенные команды возвращают статус 2.
Сам командный интерпретатор bash возвращает статус выхода последней выполненной команды, если только не обнаруживает синтаксическую ошибку. В этом случае он завершает работу с ненулевым статусом. См. также описание встроенной команды exit ниже.
Когда командный интерпретатор bash работает в интерактивном режиме, при отсутствии обработчиков сигналов, он игнорирует сигнал SIGTERM (так что команда kill 0 не прекращает работу интерактивного командного интерпретатора), а сигнал SIGINT перехватывается и обрабатывается (так, что встроенная команда wait им не прерывается). Во всех случаях, bash игнорирует сигнал SIGQUIT. Если действует управление заданиями, bash игнорирует сигналы SIGTTIN, SIGTTOU и SIGTSTP.
У синхронных заданий, запущенных командным интерпретатором bash, устанавливаются обработчики сигналов, унаследованные командным интерпретатором от родительского процесса. Если управление заданиями не действует, асинхронные команды также игнорируют сигналы SIGINT и SIGQUIT. Команды, выполняемые для подстановки результатов выполнения, игнорируют сигналы управления заданиями SIGTTIN, SIGTTOU и SIGTSTP, посланные с клавиатуры.
По умолчанию командный интерпретатор завершает работу при получении сигнала SIGHUP. Перед завершением он посылает сигналы SIGHUP всем заданиям, как выполняющимся, так и остановленным. Остановленным заданиям предварительно посылается сигнал SIGCONT, гарантирующий получение ими сигнала SIGHUP. Для предотвращения послыки интерпретатором сигнала конкретному заданию, его необходимо удалить из таблицы заданий с помощью встроенной команды disown (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее) или пометить как не получающие сигнал SIGHUP с помощью disown -h.
Если с помощью команды shopt установлена опция командного интерпретатора huponexit, bash посылает сигнал SIGHUP всем заданиям при завершении работы интерактивного начального командного интерпретатора.
При получении командным интерпретатором bash сигнала, для которого установлен обработчик, в то время, когда ожидается завершение команды, обработчик не выполняется, пока команда не завершится. Когда bash ожидает завершения асинхронной команды с помощью встроенной команды wait, получение сигнала, для которого установлен обработчик, приводит к немедленному завершению встроенной команды wait со статусом выхода более 128 сразу же после выполнения кода обработчика.
Управление заданиями - это возможность избирательно останавливать (приостанавливать) выполнение процессов и продолжать (возобновлять) их выполнение в дальнейшем. Пользователи обычно делают это через интерактивный интерфейс, совместно реализуемый драйвером терминала и командным интерпретатором bash.
Командный интерпретатор связывает задание с каждым конвейером. Он поддерживает таблицу выполняющихся заданий, которую можно просматривать с помощью команды jobs. При запуске задания асинхронно (в фоновом режиме) bash выдает строку следующего вида:
показывающую, что это задание с номером 1, а идентификатор последнего процесса в конвейере, связанном с данным заданием - 25647. Все процессы в одном конвейере являются частями одного задания. Командный интерпретатор bash использует понятие задания как основу для управления заданиями.
Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT. Эти процессы называют приритетными (процессами переднего плана). Фоновые процессы - это те, идентификатор группы процессов которых не совпадает с терминальным; таким процессам сигналы с клавиатуры не посылаются. Только приоритетные процессы могут читать данные с терминала и выдавать данные в него. Фоновые процессы, пытающиеся читать с терминала (или выдавать в него данные) получают от драйвера терминала сигнал SIGTTIN (SIGTTOU), который, если не перехвачен, приостанавливает работу процесса.
Если операционная система, в которой работает bash, поддерживает управление заданиями, bash позволяет его использовать. При нажатии клавиши приостановки (обычно ^Z, Control-Z) по ходу работы процесса, этот процесс останавливается и управление возвращается командному интерпретатору bash. При нажатии клавиши отложенной приостановки (обычно ^Y, Control-Y) процесс останавливается при попытке чтения данных с терминала, и управление возвращается командному интерпретатору bash. Затем пользователь может управлять состоянием этого задания, используя команду bg для его продолжения в фоновом режиме, команду fg - для продолжения в приоритетном режиме или команду kill для его прекращения. Нажатие ^Z срабатывает немедленно и имеет дополнительный побочный эффект в виде сброса данных, ожидающих вывода и ввода.
Командный интерпретатор поддерживает несколько способов сослаться на задание. Символ % означает начало имени задания. На задание с номером n можно сослаться как %n. На задание можно сослаться также с помощью префикса имени команды, использованной для его начала, или подстроки, входящей в соответствующую командную строку. Например, %ce ссылается на остановленное задание ce. Если префикс соответствует нескольким заданиям, bash выдает сообщение об ошибке. Обращение вида %?ce, с другой стороны, ссылается на любое задание, в командной строке которого содержится подстрока ce. Если эта подстрока содержится в нескольких заданиях, bash выдает сообщение об ошибке. Строки %% и %+ обозначают текущее задание командного интерпретатора - последнее задание, остановленное при работе в приоритетном режиме или запущенное в фоновом режиме. На предыдущее задание можно сослаться с помощью строки %-. В результатах работы команд, связанных с управлением заданиями, (в частности, в результатах выполнения команды jobs), текущее задание всегда помечается знаком +, а предыдущее - знаком -.
Для перевода задания в приоритетный режим достаточно ввести только его имя: %1 - это синоним для команды "fg %1", переводящей задание 1 из фонового в приоритетный режим. Аналогично, команда "%1 &" продолжает работу задания 1 в фоновом режиме и эквивалентна команде "bg %1".
Об изменении состояния задания командный интерпретатор узнает сразу. Обычно bash информирует об изменениях в состоянии заданий при выдаче очередного приглашения, чтобы не прерывать этой информацией выдачу любых других результатов. Если с помощью встроенной команды set установлена опция -b, bash информирует о таких изменениях немедленно.
Если при наличии остановленных заданий происходит попытка выхода из bash, командный интерпретатор выдает соответствующее предупреждение. Затем с помощью команды jobs можно проверить состояние этих заданий. Если сразу же выполняется повторная попытка завершить работу, командный интерпретатор не выдает предупреждения и остановленные задания прекращаются.
При интерактивной работе командный интерпретатор bash выдает первичное приглашение, PS1, когда он готов к вводу команды, и вторичное приглашение, PS2, когда для завершения команды необходимы дополнительные данные. Командный интерпретатор bash позволяет настраивать эти строки приглашения с помощью ряда маскируемых обратной косой специальных символов со следующими значениями:
\a | символ сигнала ASCII (звонок - 07) |
\d | дата в формате "День_недели Месяц Число" (т.е., "Tue May 26") |
\e | управляющий символ ASCII (033) |
\h | имя хоста вплоть до первого символа '.' |
\H | имя хоста |
\n | перевод строки |
\r | возврат каретки |
\s | имя командного интерпретатора - базовое имя из параметра $0 (часть полного имени после последней косой черты) |
\t | текущее время в 24-часовом формате ЧЧ:ММ:СС |
\T | текущее время в 12-часовом формате ЧЧ:ММ:СС |
\@ | текущее время в 12-часовом формате am/pm (утра/вечера) |
\u | имя текущего пользователя |
\v | версия командного интерпретатора bash (например, 2.00) |
\V | релиз командного интерпретатора bash, версия + уровень исправлений (например, 2.00.0) |
\w | текущий рабочий каталог |
\W | базовое имя текущего рабочего каталога |
\! | порядковый номер данной команды в списке истории |
\# | порядковый номер данной команды |
\$ | если эффективный идентификатор пользователя - 0, то #, иначе - $ |
\nnn | символ, соответствующий восьмеричному числу nnn |
\\ | обратная косая |
\[ | начало последовательности непечатных символов, которая может использоваться для включения в приглашение управляющих символов терминала |
\] | завeршение последовательности непечатных символов |
Порядковый номер команды и порядковый номер команды в списке истории обычно различаются: порядковый номер в списке истории задает ее позицию в списке, который может содержать команды, прочитанные из файла истории (см. раздел "ИСТОРИЯ ВЫПОЛНЕНИЯ КОМАНД" далее), тогда как порядковый номер команды задает ее позицию в списке команд, выполненных в текущем сеансе командного интерпретатора. После декодирования строки приглашения в ней выполняется подстановка значений параметров, подстановка результатов выполнения команд, результатов вычисления арифметических выражений, подстановка строк и удаление кавычек, в зависимости от значения опции командного интерпретатора promptvars (см. описание команды shopt в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее).
Это библиотека, обрабатывающая входные данные при работе командного интерпретатора в интерактивном режиме, если при его вызове не была указана опция --noediting. По умолчанию, команды редактирования строки подобны используемым в редакторе emacs. Также предоставляется интерфейс для редактирования командной строки в стиле редактора vi. Для отключения возможности редактирования после запуска командного интерпретатора используются опции +o emacs или +o vi встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).
В этом разделе для записи нажимаемых клавиш используются соглашения в стиле редактора emacs. Управляющие клавиши обозначаются C-клавиша, так что C-n сокращенно обозначает Control-N. Аналогично, метаклавиши обозначаются M-клавиша, так что M-x обозначает Meta-X. (На клавиатурах, где нет клавиши meta, M-x обозначает ESC x, т.е. нажать клавишу Escape и затем нажать клавишу x. Тем самым, клавиша ESC реализует префикс meta. Комбинация M-C-x обозначает ESC-Control-x, или нажать клавишу Escape, затем, удерживая клавишу Control, нажать клавишу x.)
Команды библиотеки readline могут иметь числовые аргументы, обычно обозначающие количество повторений. Иногда, однако, они являются признаком значимости аргумента. Передача отрицательного аргумента команде, работающей с дальнейшим текстом (например, kill-line) приводит к ее применению к предшествующему тексту. Команды, работа которых отличается от описанной здесь, специально отмечены ниже.
Если команда удаляет текст, этот текст сохраняется для дальнейшего извлечения (вставки). Удаленый текст помещается в кольцевой буфер. Последовательные удаления пополняют буфер, формируя единицу вставки. Команды, не удаляющие текст, разделяют фрагменты в кольцевом буфере удаления.
Библиотека readline настраивается с помощью команд в файле инициализации (файл inputrc). В качестве имени этого файла берется значение переменной INPUTRC. Если эта переменная не установлена, используется стандартный файл, ~/.inputrc. При запуске программы, использующей библиотеку readline, файл инициализации читается и устанавливаются соответствующие переменные и горячие клавиши. В файле инициализации readline допускаются лишь несколько простых конструкций. Пустые строки игнорируются. Строки, начинающиеся символом #, являются комментариями. Строки, начинающиеся символом $, обозначают условные конструкции. Остальные строки обозначают установки горячих клавиш и присваивания значений переменным.
Стандартные горячие клавиши можно изменить в файле inputrc. Другие программы, использующие эту библиотеку, могут добавлять собственные команды и горячие клавиши.
Например, поместив в файл инициализации
мы привязываем к комбинации клавиш M-C-u команду universal-argument библиотеки readline.
Распознаются следующие имена символов: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE и TAB. Кроме имен команд, библиотека readline позволяет привязывать к клавишам строки, которые будут вставляться при их нажатии (т.е. задвать макроподстановки).
Привязки клавиш в файле inputrc задаются с помощью простого синтаксиса. Необходимо указать только имя команды или текст макроподстановки, и горячие клавиши, с которыми его надо связать. Горячие клавиши можно задавать двумя способами: как символическое имя клавиши, возможно, с префиксом Meta- или Control-, или как комбинацию клавиш. При использовании формы имя_клавиши:имя_функции или макроподстановка, имя_клавиши просто задается на английском. Например:
В этом примере комбинация клавиш C-u связывается с функцией universal-argument, M-DEL - с функцией backward-kill-word, а C-o - с макроподстановкой, указанной в правой части (т.е. приведет к вставке текста > output в строку).
Во второй форме, "комбинация_клавиш":имя_функции или макроподстановка, комбинация клавиш отличается от использованного выше имени клавиши тем, что может задаваться в двойных кавычках. При этом можно использовать некоторые управляющие символы в стиле GNU Emacs, как в следующем примере.
В этом примере, комбинация клавиш C-u опять связывается с функцией universal-argument. Комбинация C-x C-r связывается с функцией re-read-init-file, а комбинация ESC [ 1 1 ~ будет приводить к вставке текста Function Key 1. Полный набор управляющих последовательностей в стиле GNU Emacs представлен ниже.
\C- | префикс клавиши Control |
\M- | префикс клавиши Meta |
\e | управляющий символ |
\\ | обратная косая |
\" | символ " |
\' | символ ' |
Помимо управляющих последовательностей в стиле GNU Emacs, имеется еще один набор управляющих последовательностей, начинающихся с обратной косой:
\a | предупреждение (звонок) |
\b | забой (backspace) |
\d | удаление символа (delete) |
\f | перевод страницы (form feed) |
\n | новая строка |
\r | возврат каретки |
\t | горизонтальная табуляция |
\v | вертикальная табуляция |
\nnn | символ, ASCII-код которого имеет восьмеричное значение nnn (от одной до трех цифр) |
\xnnn | символ, ASCII-код которого имеет щестнадцатеричное значение nnn (от одной до трех цифр) |
При вводе текста макроподстановки необходимо для ее обозначения указывать одиночные или двойные кавычки. Текст без кавычек считается именем функции. В теле макроподстановки интерпретируются перечисленные выше управляющие последовательности, начинающиеся с обратной косой. Обратная косая маскирует любой другой символ в тексте макроподстановки, в том числе, символы " и '.
Командный интерпретатор bash позволяет просмотреть или изменить текущие горячие клавиши библиотеки readline с помощью встроенной команды bind. Режим редактирования можно переключать в ходе интерактивной работы с помощью опции -o встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).
Библиотека readline поддерживает переменные, которые можно использовать для дополнительной настройки ее работы. Значение переменной можно установить в файле inputrc или с помощью оператора вида
За исключением явно указанных случаев, переменные readline могут иметь значения On или Off. Ниже представлены эти переменные и их стандартные значения:
Библиотека readline реализует средства, аналогичные по духу возможностям условной компиляции препроцессора языка C и позволяющие назначать горячие клавиши или присваивать значения переменным в зависимости от условий. Поддерживается четыре директивы анализатора.
Библиотека readline предлагает команды для поиска в списке истории команд (см. раздел "ИСТОРИЯ ВЫПОЛНЕНИЯ КОМАНД" ниже) строк, содержащих определенную подстроку. Имеется два режима поиска: инкрементный и не инкрементный.
Инкрементные поиски начинаются прежде, чем пользователь закончит ввод искомой строки. Привводе каждого символа искомой строки, readline выдает следующую запись из списка истории, соответствующую уже набранной подстроке. При инкрементном поиске достаточно ввести ровно столько символов, сколько надо для нахождения интересующей команды. Символы значения переменной isearch-terminators используются для завершения инкрементного поиска. Если значение этой переменной не задано, инкрементный поиск прерывается клавишами Escape и Control-J. Нажатие Control-G прерывает инкрементный поиск и восстанавливает исходную строку. При завершении поиска, запись из списка истории, содержащая строку поиска, становится текущей строкой. Для поиска других соответствующих записей в списке истории, нажмите Control-S или Control-R, в зависимости от направления поиска. В результате, будет выполнен поиск в обратном или прямом направлении следующей записи, соответствующей уже набранному фрагменту строки. Ввод любой другой последовательности символов, привязанной к команде библиотеки readline, приводит к завершению поиска и выполнению команды. Например, нажатие клавиши Enter завершит поиск и выполнит выбранную команду из списка истории.
При неинкрементом поиске перед началом поиска читается вся искомая строка. Искомая строка может быть набрана пользователем или быть частью содержимого текущей строки.
Ниже представлен список имен команд и стандартные комбинации клавиш, к которым они привязаны. Имена команд, для которых не указана комбинация клавиш, по умолчанию ни к какой комбинации не привязаны.
При включении опции -o history с помощью встроенной команды set, командный интерпретатор обеспечивает доступ к истории выполнения команд - списку ранее введенных команд. Текст последних HISTSIZE команд (по умолчанию - 500) сохраняется в списке истории. Командный интерпретатор сохраняет в списке истории команды до подстановки значений параметров и переменных (см. раздел "ЗАМЕНА" ранее), но после подстановки команд из списка истории, с учетом значений переменных командного интерпретатора HISTIGNORE и HISTCONTROL. При запуске история выполнения команд считывается из файла, имя которого задается переменной HISTFILE (стандартно - ~/.bash_history). Файл HISTFILE при необходимости усекается, чтобы в нем было не более HISTFILESIZE строк. При завершении работы интерактивного командного интерпретатора последние HISTSIZE строк копируются из списка истории выполнения команд в файл HISTFILE. Если установлена опция командного интерпретатора histappend (см. описание команды shopt в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже), строки добавляются к файлу истории, иначе файл истории перезаписывается. Если переменная HISTFILE не установлена или файл истории не доступен на запись, история выполнения команд не сохраняется. После сохранения истории файл усекается до не более чем HISTFILESIZE строк. Если переменная HISTFILESIZE не установлена усечение файла не выполняется.
Встроенная команда fc (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже) может использоваться для выдачи или редактирования и повторного выполнения части списка истории. Встроенная команда history позволяет выдавать и изменять список истории выполнения команд, а также управлять файлом истории. При редактировании командной строки во всех режимах редактирования доступны команды поиска по списку истории выполнения команд.
Командный интерпретатор позволяет управлять тем, какие команды сохраняются в списке истории. Переменные HISTCONTROL и HISTIGNORE позволяют ограничить множество сохраняемых команд. Опция командного интерпретатора cmdhist, при включении, заставляет командный интерпретатор пытаться сохранять все строки многострочной команды в одной записи списка истории, вставляя при необходимости точки с запятой для обеспечения синтаксической корректности. Опция командного интерпретатора lithist заставляет сохранять команды со встроенными переводами встрок вместо вставки точек с запятой. Установка и сброс опций командного интерпретатора рассмотрены ниже в описании встроенной команды shopt в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА".
Командный интерпретатор bash поддерживает возможность подстановки команд из списка истории, аналогично командному интерпретатору csh. В этом разделе описан соответствующий синтаксис. Эта возможность включается по умолчанию для интерактивных командных интерпретаторов и может быть отключена с помощью опции +H встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее). Не интерактивные командные интерпретаторы по умолчанию не выполняют подстановку команд из списка истории.
С помощью этой подстановки слова из списка истории можно вставлять во входной поток, что упрощает повторение команд, вставку аргументов предыдущей команды в текущую строку и исправление ошибок в предыдущих командах.
Подстановка из списка истории выполняется сразу же после считывания всей строки, прежде чем командный интерпретатор разобъет ее на слова. Это выполняется в два приема. Сначала определяется, какую строку из списка истории использовать при подстановке. Затем из этой строки выбираются части для вставки в текущую строку. Строка, выбираемая из списка истории, - это событие, а ее части, с которыми происходит работа, - слова. Для манипулирования выбранными словами поддерживаются различные модификаторы. Строка разбивается на слова точно так же, как и при чтении команды, так что несколько слов, разделенных метасимволами и взятые в кавычки, считаются одним словом. Подстановка из списка истории инициируется метасимволом подстановки из списка истории. По умолчанию - это символ !. Замаскировать этот метасимвол можно только обратной косой (\) и одиночными кавычками.
Особенностями подстановки из списка истории можно управлять путем установки ряда опций командного интерпретатора с помощью встроенной команды shopt. Если установлена опция командного интерпретатора histverify (см. описание встроенной команды shopt) и используется библиотека readline, результаты подстановки из списка истории не передаются сразу анализатору командного интерпретатора. Вместо этого, полученная в результате подстановки строка снова загружается в буфер редактирования readline для дальнейшего изменения. Если используется библиотека readline и установлена опция командного интерпретатора histreedit, неудавшаяся подстановка из списка истории команд будет повторно загружена в буфер редактирования readline для исправления. Опция -p встроенной команды history может использоваться для предварительного просмотра результатов подстановки из списка истории перед ее использованием. Опция -s встроенной команды history позволяет добавлять команды в конец списка истории без их фактического добавления, так что их можно будет повторно использовать в дальнейшем.
Командный интерпретатор позволяет управлять назначением различных метасимволов, используемых механизмом подстановки команд из списка истории (см. описание переменной histchars ранее в разделе "Переменные командного интерпретатора").
Пометка события - это ссылка на элемент командной строки в списке истории.
Пометки слов (word designators) используются для выбора необходимых слов из события. Двоеточие (:) отделяет пометку слова от спецификации события. Двоеточие можно не указывать, если пометка слова начинается символом ^, $, *, - или %. Слова нумеруются с начала строки, причем первое слово имеет номер 0. Слова вставляются в текущую строку через один пробел.
Если пометка слова указана без спецификации события, в качестве события используется предыдущая команда.
После необязательной пометки слова может идти последовательность одного или нескольких следующих модификаторов, предваряемых двоеточием - ':'.
Если явно не указано иначе, каждая из описанных в этом разделе встроенных команд, принимающих опции, начинающиеся с дефиса (-), распознает два дефиса (--) как признак завершения опций.
Опции, если они переданы, имеют следующие значения:
Команда возвращает значение 0, кроме случаев, когда передана нераспознанная опция или произошла ошибка.
Альтернативные имена каталогов в значении CDPATH разделяются двоеточием (:). Пустое имя каталога в CDPATH соответствует текущему каталогу, т.е. ".". Если каталог начинается с косой черты (/), то значение переменной CDPATH не используется. Опция -P требует использовать физическую структуру каталогов вместо следования по символьным связям (см. также опцию -P встроенной команды set); опция -L требует следовать по символьным связям. Аргумент - эквивалентен $OLDPWD. При успешной смене текущего каталога возвращается значение 0, в противном случае - 1.
-a | Каждое имя - переменная типа массив (см. раздел "Массивы" ранее). |
-f | Использовать только имена функций. |
-i | Переменная считается целочисленной; при присваивании переменной значения вычисляются арифметические выражения (см. раздел "ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ"). |
-r | Делает соответствующие переменные доступными только для чтения. Этим переменным нельзя присваивать значения в следующих операторах и их нельзя сбрасывать. |
-x | Помечает имена для экспортирования в среду для последующих команд. |
При задании '+' вместо '-' атрибут сбрасывается, за исключением того, что опцию +a нельзя использовать для уничтожения массива. При использовании в функции, команда делает каждую опцию локальной, как и команда local. Возвращается значение 0, если только не указана недействительная опция, не делается попытка определить функцию с помощью конструкции "-f foo=bar", не делается попытка присвоить значение переменной, доступной только для чтения, не делается попытка присвоить значение массиву без использования конструкции присваивания для массива (см. раздел "Массивы" ранее), не используется имя несуществующей переменной командного интерпретатора, не выполняется попытка отменить статус только для чтения переменной, созданной как доступная только для чтения, не делается попытка отменить статус массива для переменной типа массив, и не предлагается выдать определение несуществующей функции с помощью опции -f.
+n | Выдает n-ную запись слева списка, выдаваемого командой dirs при вызове без опций. Нумерация начинается с нуля. |
-n | Выдает n-ную запись справа списка, выдаваемого командой dirs при вызове без опций. Нумерация начинается с нуля. |
-c | Очищает стек каталогов, удаляя все записи. |
-l | Выдает более длинный листинг; в стандартном формате листинга для обозначения начального каталога используется тильда. |
-p | Выдает стек каталогов по одной записи в строку. |
-v | Выдает стек каталогов по одной записи в строку, выдавая индекс записи перед каждой записью. |
Если не указана недопустимая опция, и индекс n не выходит за пределы стека, возвращается значение 0.
\a | сигнал (звонок) |
\b | забой |
\c | не выводить завершающие символы новой строки |
\e | управляющий символ |
\f | прогон страницы |
\n | новая строка |
\r | возврат каретки |
\t | горизонтальная табуляция |
\v | вертикальная табуляция |
\\ | обратная косая |
\nnn | символ, ASCII-код которого - восьмеричное значение nnn (от одной до трех цифр) |
\xnnn | символ, ASCII-код которого - шестнадцатеричное значение nnn (от одной до трех цифр) |
Опция -n подавляет выдачу номеров команд. Опция -r изменяет порядок выдачи команд на противоположный. Если указана опция -l, команды выдаются в стандартный выходной поток. В противном случае вызывается указанный редактор, которому передается файл с соответствующими командами. Если редактор не задан, используется значение переменной FCEDIT или значение переменной EDITOR, если FCEDIT не установлена. Если не установлены обе переменные, используется редактор vi. По завершении редактирования, отредактированные команды выдаются и выполняются.
Вторая форма требует повторного выполнения команды после замены каждого вхождения pat на rep. Полезно задать псевдоним "r=fc -s", так что при наборе "r cc" будет выполнена последняя команда, начинавшаяся со строки "cc", а при вводе "r" будет повторно выполняться последняя команда.
Если используется первая форма, команда возвращает значение 0, если только не указана недопустимая опция или первая или последняя команда выходит за пределы номеров команд в списке истоии. Если указана опция -e, возвращается статус выхода последней выполненной команды или ошибка, произошедшая при работе с временным файлом команд. Если используется вторая форма, возвращается статус выхода повторно выполненной команды, если только команда не задает несуществующую строку в списке истории, - в этом случае команда fc возвращает 1.
Когда все опции обработаны, команда getopts завершает работу со значением, большим нуля. OPTIND при этом содержит индекс первого аргумента, не являющегося опцией, а переменная имя получает значение ?.
Команда getopts обычно обрабатывает позиционные параметры, но если заданы аргументы, getopts разбирает их.
Команда getopts может сообщать об ошибках двумя способами. Если первый символ строки_опций - двоеточие, используется немногословное информирование об ошибках. При обычной работе выдаются диагностические сообщения, если обнаруживаются недопустимые опции или недостающие аргументы. Если переменная OPTERR имеет значение 0, сообщения об ошибках не выдаются, даже если первым символом строки_опций не является двоеточие.
Если обнаружена недопустимая опция, getopts помещает ? в переменную имя и, если не задано немногословное информирование, выдает сообщение об ошибке и сбрасывает переменную OPTARG. Если getopts работает в режиме немногословного информирования, символ опции помещается в переменную OPTARG и никакие диагностические сообщения не выдаются.
Если обязательный аргумент не обнаружен, и для getopts не задано немногословное информирование, переменная имя получает значение ?, переменная OPTARG сбрасывается, и выдается диагностическое сообщение. Если getopts работает в режиме немногословного информирования, переменная имя получает значение :, а в переменную OPTARG помещается символ опции.
Команда getopts возвращает 0, если опция, указанная или не указанная, обнаружена. Она возвращает ложь, если достигнут конец опций или произошла ошибка.
-a | Добавлять "новые" строки истории (строки истории, введенные с начала текущего сеанса bash) в файл истории. |
-n | Читать строки истории, еще не прочитанные из файла истории, в текущий список истории команд. Речь идет о строках, добавленных в файл истории с начала текущего сеанса bash. |
-r | Читать содержимое файла истории и использовать его в качестве текущего списка истории выполнения команд. |
-w | Записывать текущий список истории команд в файл истории, переписывая его текущее содержимое. |
-c | Очистить список истории выполнения команд, удаляя все записи. |
-p | Выполнить подстановку из списка истории для последующих аргументов и выдать результат в стандартный выходной поток. Результат не запоминается в списке истории. Для отключения обычной подстановки из списка истории, необходимо маскировать (брать в кавычки) каждый аргумент. |
-s | Сохранить аргументы в списке истории как одну запись. Последняя команда в списке истории удаляется перед добавлением аргументов. |
Возвращается значение 0, если не передана недопустимая опция или при попытке чтения или записи файла истории не произошла ошибка.
-l | Помимо обычной информации выдает идентификаторы процессов. |
-p | Выдает только идентификаторы процессов-лидеров групп процессов, образующих задание. |
-n | Выдает информацию только о заданиях, состояние которых изменилось с момента последнего уведомления пользователя о состоянии заданий. |
-r | Выдает только выполняющиеся задания. |
-s | Выдает только остановленные задания. |
Если указано задание, выдается информация только об этом задании. Статус выхода - 0, кроме случаев, когда указана недопустимая опция или идентификатор несуществующего задания.
Если указана опция -x, команда jobs заменяет любой идентификатор задания в команде или аргументах соответствующим идентификатором группы процессов, и выполняет команду, передавая ей аргументы и возвращая ее статус выхода.
+n | Удаляет n-ную запись слева списка каталогов, начиная с нуля. Например: "popd +0" удаляет первый каталог, а "popd +1" - второй. |
-n | Удаляет n-ную запись справа списка каталогов, начиная с нуля. Например: "popd -0" удаляет последний каталог, а "popd -1" - предпоследний. |
-n | Подавляет обычное измнение текущего каталога при удалении каталогов из стека, так что изменяется только содержимое стека. |
Если команда popd завершается успешно, выполняется также команда dirs и возвращается статус 0. Команда popd возвращает ложь, если выявлена недопустимая опция, стек каталогов - пустой, указана несуществующая запись в стеке каталогов или не удалось перейти в соответствующий каталог.
Формат при необходимости используется повторно, чтобы покрыть все аргументы. Если формат требует больше аргументов, чем передано, дополнительные спецификации формата раскрываются как если бы были переданы нулевые значения или пустые строки, соответственно.
+n | Прокручивает стек так, что n-ный каталог (при подсчете слева по списку каталогов, начиная с 0) становится вершиной. |
-n | Прокручивает стек так, что n-ный каталог (при подсчете справа по списку каталогов, начиная с 0) становится вершиной. |
-n | Эта опция подавляет обычный переход в каталог при добавлении каталогов в стек, так что действия выполняются только со стеком. |
каталог | Добавляет каталог на вершину стека каталогов, делая его текущим рабочим каталогом. |
Если команда pushd выполнена успешно, выполняется также команда dirs. Если используется первая форма, pushd возвращает 0 за исключением случая, когда не удалось перейти в каталог. При использовании второй формы pushd возвращает 0, если только стек каталогов не пустой, не указан несуществующий элемент стека и удалось перейти в новый текущий каталог.
-r | Обратная косая не обрабатывается как символ маскировки. Она считается частью строки. В частности, для продолжения на следующей строке нельзя использовать пару обратная косая/новая строка. |
-p | Выдает приглашение, без завершающего перевода строки, перед чтением входного потока. Приглашение выдается только если входные данные идут с терминала. |
-a | Слова присваиваются последовательным элементам массива имя_массива, начиная с 0. Имя_массива сбрасывается перед присваиванием новых значений. Другие имена в аргументах игнорируются. |
-e | Если стандартный входной поток идет с терминала, для получения строки используется библиотека readline (см. раздел "БИБЛИОТЕКА READLINE" ранее). |
Если имена не указаны, прочитанная строка присваивается переменной REPLY. Статус выхода - 0, если только не встретился символ конца файла.
-a | Автоматически помечать изменяемые или создаваемые переменные как экспортируемые в среду для последующих команд. | ||||||||||||||||||||||||||||||||||||||||||||
-b | Сообщать о состоянии прерванных фоновых заданий немедленно, а не перед выдачей следующего первичного приглашения. Эта опция действует только если включено управление заданиями. | ||||||||||||||||||||||||||||||||||||||||||||
-e | Немедленно завершать работу, если простая команда (см. раздел "СИНТАКСИС КОМАНД" ранее) завершает работу с ненулевым статусом выхода. Работа командного интерпретатора не завершается, если закончившаяся неудачно команда является частью цикла until или while, частью оператора if, частью списка && или ||, или если к статусу выхода команды применяется отрицание с помощью оператора !. | ||||||||||||||||||||||||||||||||||||||||||||
-f | Отключить подстановку имен файлов. | ||||||||||||||||||||||||||||||||||||||||||||
-h | Запоминать местонахождение команд, найденное при выполнении. Эта опция включена по умолчанию. | ||||||||||||||||||||||||||||||||||||||||||||
-k | Помещать в среду все аргументы в виде операторов присваивания, а не только предшествующие имени команды. | ||||||||||||||||||||||||||||||||||||||||||||
-m | Режим мониторинга. Управление заданиями включено. Эта опция стандартно устанавливается для интерактивных командных интерпретаторов в системах, где управление заданиями поддерживается (см. раздел "УПРАВЛЕНИЕ ЗАДАНИЯМИ" ранее). Фоновые процессы работают в отдельной группе процессов, и строка, содержащая их статус выхода, выдается при завершении их работы. | ||||||||||||||||||||||||||||||||||||||||||||
-n | Читать команды, но не выполнять их. Эту опцию можно использовать для проверки наличия синтаксических ошибок в сценариях командного интерпретатора. Интерактивные командные интерпретаторы ее игнорируют. | ||||||||||||||||||||||||||||||||||||||||||||
-o имя_опции |
Имя_опции может иметь одно из следующих значений:
| ||||||||||||||||||||||||||||||||||||||||||||
-p | Включить привилегированный режим. В этом режиме файлы $ENV и $BASH_ENV не обрабатываются, функции командного интерпертатора не наследуются из среды, а переменная среды SHELLOPTS игнорируется. Если командный интерпретатор запущен с эффективным идентификатором пользователя (группы), не совпадающим с реальным, а опция -p не задана, выполняются перечилсенные действия и эффективный идентификатор устанавливается равным реальному. Если опция -p задана при запуске, эффективный идентификатор не сбрасывается. Отключение данной опции приводит к установке эффективных идентификаторов пользователя и группы равными реальным. | ||||||||||||||||||||||||||||||||||||||||||||
-t | Завершить после чтения и выполнения одной команды. | ||||||||||||||||||||||||||||||||||||||||||||
-u | При подстановке значений параметров рассматривать не установленную переменную как ошибку. При попытке подстановки значения не существующей переменной командный интерпретатор выдает сообщение об ошибке и, если он - не интерактивный, завершает работу с ненулевым статусом выхода. | ||||||||||||||||||||||||||||||||||||||||||||
-v | Выдавать строки команд по мере чтения. | ||||||||||||||||||||||||||||||||||||||||||||
-x | После подстановок в каждой простой команде выдавать значение переменной PS4, а затем - команду с результатами подстановок в аргументах. | ||||||||||||||||||||||||||||||||||||||||||||
-B | Выполнять подстановку квадратных скобок в командном интерпретаторе (см. раздел "Подстановка выражений в скобках" ранее). Эта опция установлена по умолчанию. | ||||||||||||||||||||||||||||||||||||||||||||
-C | Если эта опция установлена, bash не переписывает существующий файл при перенаправлениях с помощью операторов >, >& и <>. Это поведение можно переопределить при создании выходных файлов, применяя оператор перенаправления |> вместо >. | ||||||||||||||||||||||||||||||||||||||||||||
-H | Включить подстановку из списка истории с помощью метасимвола !. Эта опция по умолчанию установлена в интерактивных командных интерпретаторах. | ||||||||||||||||||||||||||||||||||||||||||||
-P | Если эта опция установлена, командный интерпретатор не следует по символьным связям при выполнении команд типа cd, изменяющих текущий рабочий каталог. Вместо этого, он использует физическую структуру каталогов. По умолчанию, bash следует по логической цепочке каталогов при выполнении команд, изменяющих текущий каталог. | ||||||||||||||||||||||||||||||||||||||||||||
-- | Если после этой опции нет аргументов, сбрасываются значения позиционных параметров. В противном случае, позиционные параметры устанавливаются в соответствии с аргументами, даже если некоторые из них начинаются с дефиса (-). | ||||||||||||||||||||||||||||||||||||||||||||
- | Сигнализирует об окончании опций, так что все оставшиеся аргументы присваиваются позиционным параметрам. Опции -x и -v при этом отключаются. Если больше аргументов нет, позиционные параметры остаются без изменений. |
Опции по умолчанию отключены, если явно не сказано иначе. При указании + вместо - перед буквой опции, опция отключается. Опции также можно задавать как аргументы при вызове командного интерпретатора. Текущий набор опций представлен в виде значения параметра $-. Статус выхода - 0, если только не указана недопустимая опция.
-s | Включает (устанавливает) все указанные опции. |
-u | Отключает (сбрасывает) все указанные опции. |
-q | Подавляет выдачу стандартной информации (немногословный режим); статус выхода показывает, установлена опция или нет. Если после -q указано несколько имен_опций, статус выхода - 0, если все указанные опции включены и не 0 в противном случае. |
-o | Ограничивает значения имен_опций только поддерживаемыми в опции -o встроенной команды set. |
Если опция -s или -u использована без аргументов, выдается информация только об установленных или неустановленных опциях, соответственно. Если не указано иначе, опции команды shopt по умолчанию отключены (сброшены).
Статус выхода при выдаче опций - 0, если все указанные опции включены и не 0 в противном случае. При установке или сбросе опций статус выхода - 0, если только не указана недопустимая опция командного интерпретатора.
Вот список допустимых опций команды shopt:
Выражения можно комбинировать с помощью следующих операторов, перечисленных по убыванию приоритета.
Команды test и [ проверяют условные выражения с помощью набора правил, основанного на количестве аргументов.
-a | Выдается информация о всех текущих ограничениях |
-c | Максимальный размер создаваемых файлов core |
-d | Максимальный размер сегмента данных процесса |
-f | Максимальный размер файлов, создаваемых командным интерпретатором |
-l | Максимальный размер сегмента, который может быть привязан к памяти |
-m | Максимальный размер резидентного набора |
-n | Максимальное количество открытых файловых дескрипторов (большинство систем не позволяет устанавливать это значение) |
-p | Размер программного канала в 512-байтовых блоках (его устанавливать нельзя) |
-s | Максимальный размер стека |
-t | Максимальное количество процессорного времени в секундах |
-u | Максимальное количество процессов для одного пользователя |
-v | Максимальный объем виртуальной памяти, доступный командному интерпретатору |
Если ограничение указано, оно становится новым предельным значением для соответствующего ресурса (опция -a только выдает информацию). Если опции не заданы, предполагается опция -f. Значения представляются в единицах 1024 байта, за исключением опции -t, где значения - в секундах, -p, где значения - в 512-байтовых блоках, и опций -n и -u, для которых значения не масштабируются. Статус выхода - 0, если не указана недопустимая опция, в качестве ограничения не задано не числовое значение, отличное от unlimited, и при установке нового ограничения не произошла ошибка.
Если bash запущен по имени rbash или с опцией -r при вызове, командный интерпретатор становится ограниченным. Ограниченный командный интерпретатор используется для создания более управляемой стреды по сравнению с обычным интерпретатором. Он ведет себя аналогично bash, но следующие действия не разрешены или не выполняются:
Эти ограничения применяются после чтения файлов начального запуска.
При выполнении команды, которая оказалась сценарием командного интерпретатора (см. раздел "ВЫПОЛНЕНИЕ КОМАНД" ранее), rbash отключает любые ограничения в командном интерпретаторе, порожденном для выполнения сценария.
Брайан Фокс (Brian Fox), Free Software Foundation
bfox@gnu.ai.MIT.Edu
Чет Реми (Chet Ramey), Case Western Reserve University
chet@ins.CWRU.Edu
Если вы обнаружили ошибку в bash, сообщите о ней. Но сначала убедитесь, что это действительно ошибка, и что она проявляется в последней имеющейся у вас версии bash.
После того, как определено, что ошибка действительно существует, используйте команду bashbug для посылки сообщения об ошибке. Если вы знаете, как ошибку исправить, пришлите и исправление! Предложения и "философские" сообщения об ошибках можете отправлять по электронной почте по адресу bug-bash@gnu.org или в дискуссионную группу Usenet gnu.bash.bug.
ВСЕ сообщения об ошибках должны включать:
Команда bashbug вставляет первые три компонента в предлагаемый шаблон сообщения об ошибке автоматически.
Комментарии и сообщения об ошибках на этой странице справочного руководства отправляйте по адресу chet@ins.CWRU.Edu.
Комментарии и сообщения об ошибках в переводе этой страницы справочного руководства на русский язык отправляйте по адресу valera@openxs.kiev.ua.
Слишком большой и слишком медленный.
Есть ряд небольших отличий между bash и традационными версиями sh, в основном, связанные с поддержкой спецификации POSIX.
Псевдонимы иногда могут сбивать с толку.
Встроенные команды и функции интерпретатора нельзя остановить/перезапустить.
Составные команды и последовательности команд вида 'a ; b ; c' обрабатываются некорректно при попытке приостановки процесса. Когда процесс останавливается, командный интерпретатор немедленно выполняет следующую команду в последовательности. Для выполнения последовательности команд в порожденном командном интерпретаторе, что позволяет останавливать их, как единое целое, достаточно взять ее в скобки.
Команды в операторе подстановки результатов выполнения команды $(...) не разбираются, пока не будет выполнена попытка подстановки. Это откладывает выдачу сообщения об ошибке на определенное время при вводе команды.
Нельзя (пока) экспортировать массивы.
Исходный код bash доступен в пакете SUNWbashS.
Последнее изменение: 20 января 1999 года
Copyright 2002 В. Кравчук, OpenXS Initiative, перевод на русский язык
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |