Bash - зто сокращение "Bourne Again SHell" (Еще одна оболочкa Борна). Борновская оболочка - традиционная оболочка Unix, первоначально написанная Стивеном Борном. Все встроенные команды борновской оболочки доступны в Bash, и правила вычислений и синтаксис вэяты иэ спецификации Posix 1003.2 для стандартной оболочки Unix.
Этот раздел кратко суммирует то, что Bash унаследовал от борновской оболочки: структуры контроля оболочки, встроенные команды, переменные и другие особенности. Здесь также перечисляются наиболее значительные раэличия между Bash и борновской оболочкой.
Замечание: Символ ";" в описании синтаксиса команд может быть заменен на одну или несколько строк.
Bash содержит следующие циклические конструкции:
Синтаксис команды until:
until тестовые_команды; do команды-следствия; done
Выполнение "команд-следствий" происходит, пока финальная
команда в "тестовых_командах" имеет ненулевое состояние на
выходе.
Синтаксис:
while тестовые_команды; do команды-следствия; done
Выполнение "команд-следствий" происходит, пока финальная
команда в "тестовых_командах" имеет нулевое состояние на
выходе.
Синтаксис:
for имени [in список_слов...]; do команды; done
Выполняет команды для каждого члена "списка_слов", равного
текущему члену. Если "in список_слов" отсутствует,
предполагается "in "$@"".
Синтаксис:
if тестовые_команды; then
команды-следствия;
[elif сверхтестовые_команды; then
сверхследcтвия;]
[else альтернативные_следствия;]
fi
Выполнение "команд-следствий" начинается, только если
финальная команда "тестовых_команд" имеет нулевое выходное
состояние. В противном случае каждый список elif выполняется
в свою очередь, и если его состояние на выходе нулевое, то
выполняются "сверхследствия", и команда эавершена. Если
присутствуют также "альтернативные_следствия", и финальная
команда в предложении if или elif имеет ненулевое выходное
состояние, то выполняются "альтернативные_следствия".
Синтаксис:
case слово in [шаблон[|шаблон]...) команды ;;]...esac
Иэбирательное выполнение команд основано на сравнивании
"слова" с "шаблоном". Символ "|" испольэуется для разделения
нескольких шаблонов. Пример испольэования case для описания
интересного свойства животного:
echo -n "Введите имя животного:"
read animal
echo -n "$animal имеет "
case $animal in
лошадь|собака|кошка) echo -n "четыре";;
человек|кенгуру) echo -n "две";;
*) echo -n "неиэвестное число ";;
esac
echo "ног(и)."
Функции оболочки позволяют при выполнении группы команд испольэовать одно имя для всей группы. Функции выполняются так же, как "обычные команды".
Функции описываются с испольэованием следующего синтаксиса:
[function] имя () { список команд; }
Это описывает функцию с именем "имя". Тело функции - "список
команд", эаключенный в фигурные скобки. Этот список запускается
всегда, когда "имя" указывается как имя команды. Выходное состояние
функции - выходное состояние последней команды, выполняемой в теле.
Когда функция выполняется, ее аргументы становятся поэиционными параметрами времени ее выполнения. Специальный параметр # содержит количество позиционных параметров. Позиционный параметр 0 неизменный.
Если встроенная команда return выполняется внутри функции, выполнение функции прекращается и возобновляется со следующей команды после вызова функции. Когда функция завершается, значения позиционных параметров и специального параметра # становятся равными значениям до вызова функции.
Нижеследующие всроенные команды оболочки унаследованы из оболочки Борна. Эти команды реализованы, как указано в стандарте Posix 1003.2.
ничего не делает кроме расширения каких-либо аргументов и выполнения переназначения
читает и выполняет команды из аргумента имени файла в текущем контексте оболочки
выход из цикла for, while или until
смена текущей рабочей директории
выполнение следующей итерации цикла for, while или until
вывод аргументов, разделенных пробелами, на стандартное устройство вывода
аргументы собираются в одну команду, которая потом читается и выполняется
если задан аргумент команды, он смещает оболочку. Если не задан аргумент команды, переназначения могут быть использованы для влияния на текущую среду оболочки
выход из оболочки
отмечает аргументы как переменные для передачи в дочерние процессы в среде
передает опции в скрипты оболочки или функции
запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
посылает сигнал процессу
выводит текущий рабочий каталог
читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.
отмечает переменные как неизменяемые
заставляет функцию оболочки выйти с указанным значением
перемещает позиционные параметры налево
вычисляет условное выражение
выводит имя пользователя и системное время, использованное оболочкой и ее потомками
указывает команды, которые должны выполняться при получении оболочкой сигнала
устанавливает маску создания процессового файла
вызывает уничтожение переменных оболочки
ждет выхода из дочернего процесса и сообщает выходное состояние.
Bash использует определенные переменные так же, как и оболочка Борна. В некоторых случаях Bash приписывает переменной значение по умолчанию.
список символов, разделяющих поля, используемый когда оболочка разделяет слова как часть расширения
разделенный двоеточиями список каталогов, в которых оболочка ищет команды
текущий домашний каталог пользователя
разделенный двоеточиями список каталогов, используемых в поиске пути для сd-команд
разделенный двоеточиями список файлов, которые оболочка периодически проверяет на наличие почты. Можно также указать, какое сообщение выводить для отделения имени файла от сообщения с "?" В тексте послания $_ ставится для имени текуще го файла почты
базовая строка приглашения
вторичная строка приглашения
индекс последней опции, обработанной встроенной командой getopts
значение аргумента последней опции, обработанной встроенной командой getopts.
Bash реализует практически такую же грамматику, подстановку параметров и переменных, перенаправление и использование кавычек и апострофов, как и в оболочке Борна. Bash опирается на стандарт Posix 1003.2 как спецификацию того, как эти возможности должны быть реализованы. Однако, имеются некоторые отличия между обычной оболочкой Борна и стандартом POSIX; этот раздел описывает некоторые наиболее значительные отличия. Некоторые другие отличия будут упомянуты в других разделах этого документа.
Bash использует ключевой символ "!" для отрицания значения, возвращаемого конвейером. Очень полезно, когда выражение if выполняется только при возвращении ненулевого значения.
Bash включает brace-расширение (см. раздел 2.2 ).
Bash включает шаблоны образцов Posix и ksh- стиля, убирая конструкции %% и ## для удаления ведущей или завершающей подстроки из переменных.
Обеспечиваются Posix и ksh форма подстановки команд $(), наряду с конструкцией ` ` из оболочки Борна (которая также обеспечивается для совместимости).
Переменные, присутствующие в начальной среде оболочки, автоматически выносятся в дочерние процессы. Оболочка Борна не делает этого должным образом, если переменные точно не промаркированы с помощью команды export.
Поддерживается расширение ${#xx}, которое возвращает длину $xx.
Переменная IFS используется для разделения не всех слов, а только результатов расширения. Это закрывает давнее отверстие в защите оболочки.
Могут быть переменная и функция с одним и тем же именем: sh не разделяет два пространства имен.
В функциях Bash могут быть локальные переменные, таким образом можно писать весьма полезные рекурсивные функции.
Опция noclobber предназначена для избежания переписывания существующих файлов с помощью переназначенного вывода.
Bash позволяет написать функцию так, чтобы переопределить встроенную команду, и обеспечивает доступ к функциональности встроенных команд внутри функции благодаря встроенным командам builtin и command.
Встроенная команда builtin позволяет избирательное выключение функций при выполнении поиска команд.
Отдельные встроенные команды могут выть включены или выключены при использовании встроенной команды enable.
Функции могут быть переданы потомку через среду.
Встроенная команда read читает окончание строки в \ с помощью опции -r и использует переменную $REPLY по умолчанию, если аргументы не даны.
Встроенная команда return может быть использована для прекращения выполнения скриптов, выполненных встроенными командами . или source.
Встроенная команда umask позволяет символизировать аргументы аналогично chmod.
Встроенная команда test незначительно отличается от той, что обеспечивается стандартом Posix 1003.2, которая описывает поведение, исходя из числа аргументов.
С-оболочка(csh) была создана Биллом Джоем в университете Беркли. Считается, что в общем она имеет лучшие возможности диалогового использования, чем изначальная оболочка Борна. Некоторые возможности csh присутствуют в Bash, включая управление заданиями, расширение истории, т.н. "защищенное" переназначение и некоторые переменные для контроля за диалоговым режимом оболочки (IGNOREEOF).
Подробно об подстановке строк из истории см. гл.6.
Bash имеет тильдовое (~) расширение, подобное, но не идентичное соответствующему в csh. Следующая таблица показывает, что слова без кавычек начинаются с тильдового расширения.
текущее значение $HOME.
~/foo
Подкаталог foo домашнего каталога пользователя fred.
`$PWD/foo`
`$OLDPWD/foo`
Вrace (фигурноскобочное)-расширение - механизм, с помощью которого можно генерировать произвольные строки. Этот механизм подобен pathname-расширению (подробнее см. Bash manual page), но в нем нет необходимости существования имен файлов. Образец brace-расширения: опционная преамбула, затем серия разделенных запятыми строк, заключенная в фигурные скобки, и опционная постамбула. Преамбула предваряет каждую строку, заключенную в фигурные скобки, а постамбула заключает каждую результирующую строку - слева направо.
Brace-расширения могут вкладываться одно в другое. Результаты каждой расширенной строки не сортируются: сохраняется порядок слева направо. Например:
a{d,c,b}e
расширяется в
ade ace abe.
Brace-расширение выполняется перед всеми остальными расширениями, и
все специальные символы других расширений сохраняются в результате.
Это строго текстуально. Вash не использует никакой синтаксической
интерпретации контекста расширения или текста, заключенного в фигурные
скобки.
Правильно сформированное brace-расширение должно содержать открывающую и закрывающую фигурные скобки без кавычек, и по крайней мере одну запятую. Любое неправильное brace-расширение остается неизменным.
Эта конструкция используется для краткости, когда нужно породить общий префикс строк длиннее, чем в следующем примере:
mkdir usr/local/src/bash/{old,new,dist,bugs}
или
chown root/usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}.
Bash имеет несколько встроенных команд, описания которых очень похожи на соответствующие в csh.
pushd [dir | +n | -n]
Сохраняет текущий каталог в списке и применяет cd к dir.
Без аргументов изменяет верхний из двух каталогов.
Перемещает n-й каталог (считая с левой стороны списка, выведенного с помощью dirs) на вершину списка с помощью обработки стека.
Перемещает n-й каталог (считая с правой стороны списка, выведенного с помощью dirs) на вершину списка с помощью обработки стека.
Устанавливает текущий рабочий каталог на вершину стека и применяет cds к dir. Для того, чтобы посмотреть список каталогов, используется команда dirs.
popd [+n | -n]
Выкладывает каталог из стека и применяет cds к новому
верхнему каталогу. Если не даны аргументы, убирает верхний
каталог из стека и применяет cds к новому верхнему
каталогу. Элементы нумеруются начиная с 0 с первого
каталога, занесенного в список с помощью dirs, таким
образом команда popd эквивалентна popd +0.
Перемещает n-й каталог (считая с левой стороны списка, выведенного с помощью dirs), начиная с 0.
Перемещает n-й каталог (считая с правой стороны выведенного списка от dirs), начиная с 0.
dirs [+n | -n] [-l]
Выводит список текущих запомненных каталогов. Каталоги
заносятся в список с помощью команды pushd. Возвращаться
обратно по списку можно с помощью команды popd.
Выводит n-й каталог (считая с левой стороны списка,выведенного с помощью dirs, когда вызов без опций), начиная с 0.
Выводит n-й каталог (считая с правой стороны списка, выведенного с помощью dirs, когда вызов без опций), начиная с 0.
Выдает полный листинг; формат вывода списка по умолчанию использует тильду для обозначения домашнего каталога.
history [n] [ [-w -r -a -n] [имя файла]]
Выводит список истории с номерами строк. Строковые
приставки с a * модифицируются. Аргумент n сообщает списку
только последние n строк. Опция -w - запись текущей истории
в файл истории; -r - чтение текущего файла истории и
превращение его содержимого в список истории. Аргумент -a присоединение новых строк истории (строки истории входят во
время начала текущего сеанса Bash) к файлу истории.
Наконец, аргумент -n - чтение строк истории, которые еще не
считаны из файла истории, в текущий список истории. Это
строки, присоединенные к файлу истории во время начала
текущего сеанса Bash. Если дано имя файла, то он
используется как файл истории, иначе если $HISTFILE имеет
значение, то оно используется. В противном случае
используется `"/.bash_history`.
Выход из login-оболочки.
Синоним '.' (см. раздел 1.4. "Встроенные команды оболочки Борна").
Если эта переменная задана, она представляет ряд последовательных EOF Bash, которые будут читаться перед выходом. По умолчанию Bash осуществляет выход на чтение одного EOF.
Если эта переменная задана, Bash рассматривает некаталоговые аргументы команды cd как имена переменных, чьи значения каталоги, в которые нужно перейти.
В этой главе описаны возможности, первоначально появившиеся в оболочке Корна (ksh). В некоторых случаях стандарт Posix 1003.2 позаимствовал эти команды и переменные из оболочки Корна. Bash обеспечивает эти возможности, используя стандарт Posix как руководство.
Bash включает конструкцию select оболочки Корна. Эта конструкция позволяет облегчать генерацию меню. Она имеет почти тот же синтаксис, что и команда for.
Cинтаксис команды select:
select имя [in список_слов] do команды; done
Cписок слов, следующих за in, расширяется, генерируя список
элементов. Набор расширенных слов, каждому из которых предшествует
число, выводится в стандартный поток ошибки. Если "in список_слов"
пропущено, выводятся позиционные параметры, затем возникает
приглашение PS3 и читается строка со стандартного ввода. Если строка
состоит из числа, соответствующего одному из выведенных слов, то
значение "имени" присваивается этому слову. Если строка пуста, то
опять выводятся слова и приглашение. Если читается EOF, то выполняется
команда select. Любое другое прочитанное значение вызывает
присваивание "имени" нуля. Считанная строка хранится в переменной
REPLY.
"Команды" выполняются после каждого выбора до команды break или return. Здесь команда select считается выполненной.
В этом разделе описаны встроенные команды Bash, взятые из ksh.
fc [-e имя_редактора] [-nlr] [первая] [последняя]
fc -s [pat=rep] [команда]
Команда фиксации. В первой форме ряд команд от первой до
последней выбирается из списка истории. И первая, и
последняя могут быть указаны как строка (чтобы обнаружить
самую последнюю команду, начинающуюся с этой строки) или как
число (индекс в списке истории, где отрицательное число
используется как смещение числа текущей команды). Если
последняя команда не указана, ей присваивается первая. Если
первая не указана, ей присваивается предыдущая команда для
редактирования и -16 для внесения в список. Если дан флаг
-l, команды выносятся в виде списка на стандартный вывод.
Флаг -n хранит номера команд при составлении списка. Флаг -r
меняет порядок списка на обратный. Иначе редактор, заданный
в имя_редактора, вызывается файлом, содержащим эти команды.
Если имя_редактора не дано, используется значение следующего
расширения переменной: ${FCEDIT:-${EDITOR-vi}}. Если задано
значение FCEDIT, используется оно, если значение EDITOR оно, если не задано ни то, ни другое, используется vi.
Редактирование завершено, когда команды редактирования
отображены на экране и выполнены.
Во второй форме "команда" перевыполняется после каждого случая pat, - в некоторых командах он заменен на rep.
Полезно использовать псевдоним r='fc -s' с командой fc, таким образом при наборе r cc выполняется последняя команда, начинающаяся с сс, и при наборе r перевыполняется последняя команда (см. раздел 3.4. "Псевдонимы").
встроенная команда let позволяет выполнять арифметические операции с переменными оболочки. Подробнее см. раздел 4.7.3. "Арифметические встроенные функции".
Команда typеset обеспечивает согласованность с оболочкой Корна, однако она сделана как рудимент команды declare (см. раздел 4.4 "Встроенные команды Bash").
Переменная по умолчанию для встроенной команды read.
Каждый раз при ссылке на этот параметр генерируется случайное целое число. Присваивание этой переменной значения обновляет генератор случайных чисел.
Эта переменная зависит от количества секунд, прошедших со старта оболочки. При присваивании переменной значения это количество прибавляется к приписанному значению, и расширенное значение = приписанное значение + число секунд с момента присваивания.
Значение этой переменной используется как приглашение для команды select.
Это приглашение, выводимое перед высвечиванием командной строки, когда установлена опция -x (см. раздел 4.5).
Текущий рабочий каталог, установленный командой cd.
Предыдущий рабочий каталог, установленный командой cd.
Если заданное значение больше 0, оно рассматривается как количество секунд ожидания ввода после высвечивания первичного приглашения. Если ввод по истечении этого времени не произошел, Bash завершает работу.
Оболочка содержит ряд псевдонимов, которые могут быть введены в действие или запрещены с помощью команд alias и unalias.
Для первого слова каждой команды, если нет кавычек, проверяется, имеет ли оно псевдоним. Если имеет, то оно заменяется на текст псевдонима. Имя псевдонима и текст замены могут содержать любые допустимые символы ввода оболочки, включающие метасимволы оболочки, за тем исключением, что имя псевдонима не может содержать =. Первое слово текста замены проверяется на наличие псевдонима, но слово, идентичное псевдониму, не расширяется вторично. Это значит, что можно, например, расширить псевдоним ls до "ls -F", и Bash не будет пытаться рекурсивно расширить текст замены. Если значение последнего символа псевдонима пробел или tab, то слова команды, следующей за псевдонимом, также проверяются на расширение псевдонима.
Псевдонимы создаются и заносятся в список с помощью команды alias, и уничтожаются с помощью команды unalias.
Не существует такого механизма для использования аргументов в тексте псевдонима, как в csh. Если нужны аргументы, должна использоваться функция оболочки.
Псевдонимы не расширяются, когда оболочка не является диалоговой.
Правила, касающиеся определения и использования псевдонимов, несколько запутаны. Bash всегда считывает по меньшей мере одну целую строку ввода перед выполнением любой из команд на этой строке. Псевдонимы расширяются после чтения команды, а не после ее выполнения. Таким образом, определение псевдонима, возникающее на той же строке, что и другая команда, не действует до тех пор, пока не будет прочитана следующая строка ввода. Это значит, что команды, следующие за определением псевдонима на той же строке, не затрагиваются новым псевдонимом. Выход из режима осуществляется, когда команды выполнены. Псевдонимы расширяются, когда прочитано определение функции, а не тогда, когда она выполнена, т.к. определение функции - само по себе составная команда. Как следствие, псевдонимы, определяемые в функции, недоступны до тех пор, пока она не выполнится. Для безопасности нужно всегда располагать определения псевдонимов на отдельных строках, и не стоит использовать команду alias в составных командах.
Следует заметить, что почти во всех случаях псевдонимы вытесняются функциями оболочки.
alias [имя[=значение]...]
Без аргументов - выводит список псевдонимов на стандартное
устройство вывода. Если есть аргументы, псевдоним
определяется для каждого имени, чье значение дано. Если
значение не дано, выводятся имя и значение псевдонима.
unalias [-a] [имя...]
Удаляет имя из списка псевдонимов. При использовании -а
удаляются все псевдонимы.
В этой главе описаны возможности, уникальные для Bash.
Кроме односимвольных опций командной строки оболочки (см. раздел 4.5.), есть несколько мультисимвольных опций, которые можно использовать. Для того, чтобы быть узнанными, эти опции должны появляться на командной строке перед односимвольными опциями.
Не читает инициализацию файла '~/.bashrc' в диалоговой оболочке. Это по умолчанию, если оболочка вызывается как sh.
Выполняет команды из файла имя_файла (вместо '~/.bashrc') в диалоговой оболочке.
Не загружает файл начальных действий системы '/etc/profile' или любой из файлов персональной инициализации '~/.bash-profile' ,'~/bash-login' или '~/.profile', когда Bash вызывается как login.
выводит номер версии оболочки.
включает оболочку, как если бы она вызывалась с login. Это эквивалентно 'exec - bash', но может происходить из другой оболочки, такой как csh. Если вы хотите заменить вашу текущую входную оболочку Bash, вы должны набрать 'exec bash -login'.
Не выполняет brace-расширение (см. раздел 2.2).
Не использует библиотеку GNU (СМ. главу 7 "Редактирование командной строки") для чтения диалоговых командных строк.
Изменяет поведение Bash в соответствии со стандартом Posix 1003.2, когда операция по умолчанию отличается от этого стандарта. Это предназначено для того, чтобы строго подчинить Bash стандарту.
Читает и выполняет команды со строки после выполнения опций, затем выходит.
Заставляет оболочку выполнять команды в интерактивном режиме.
Если есть этот флаг, или после обработки опций не осталось аргументов, то команды считываются со стандартного ввода. Эта опция позволяет устанавливать позиционные параметры при вызове диалоговой оболочки.
Когда и как Bash выполняет файлы начальных действий:
Таким образом обычно ~/bash_profile содержит строку:
if [-f ~/.bashrc ]; then source ~/.bashrc; fi
после (или перед) любой специфической инициацией входа.
Если Bash вызывается как sh, он старается как можно больше походить на sh. Для login-оболочки он пытается использовать в качестве источника только '/etc/profile' и '~/.profile', в таком порядке. Oпция nonprofile может при этом использоваться для блокирования режима. Оболочка, вызванная sh, не пытается использовать в качестве источника ни один из файлов начальных действий.
Когда Bash запускается в режиме POSIX опцией -posix командной строки, он следует стандарту Posix 1003.2 для файлов начальных действий. В этом режиме переменная ENV расширяется, и этот файл используется в качестве источника; другие файлы начальных действий не считываются.
Может возникнуть ситуация, что хочется определить внутри сценария начальных действий, выполняется bash в диалоговом режиме или нет. Для того, чтобы это сделать, нужно проверить переменную $PS1 - она задана в диалоговых оболочках и не задана в недиалоговых.
Таким образом:
if [-z "$PS1"]; then
echo Эта оболочка недиалоговая
else
echo Эта оболочка диалоговая
fi
Вы можете заставить диалоговый Bash не выполнять ваш файл
'~/.bashrc' с флагом -norc, можете изменить имя файла '~/.bashrc' на
любое другое имя файла с помощью имени -rcfile, и можете заставить
Bash не выполнять ваш файл '~/.bash_profile' с флагом -nonprofile.
В этом разделе описаны встроенные команды, уникальные для Bash или расширенные в нем.
builtin [встроенная_команда_оболочки [аргументы]]
Выполняет встроенную команду оболочки. Это используется,
когда вы хотите заменить встроенную команду оболочки
функцией, но нужна функциональность встроенной команды
внутри самой функции.
bind [-m таблица_ключей] [-lvd] [-q имя]
bind [-m таблица_ключей] -f имя_файла
bind [-m таблица_ключей] последовательность_ключей:имя_функции
Изображает ключ текущего Readline (см. главу 7
"Редактирование командной строки") и связи функций, или
компонует последовательность ключей в функцию Readline или
макрофункцию. Введенный скомпонованный синтаксис идентичен
синтаксису '.inputrc' (см. раздел 7.3.), но каждая связь
должна быть передана как отдельный
аргумент:'"\C-x\C-r":re-read-init-file'. Если используются
опции, они имеют следующие значения:
Используется таблица_ключей как таблица ключей, на которую должны влиять последующие связывания: имена таблицы ключей, которые могут введены emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command и vi-insert. vi эквивалентно vi-command, emacs эквивалентно emacs-standard.
Перечисляет имена всех функций чтения строки.
Перечисляет текущие имена функций и свяэывания.
Сбрасывает имена функций и присваивания так, чтобы их можно было перечитывать.
Считывает присваивания ключей файла с именем имя_файла.
Запрос о том, какие ключи вызывают названную функцию.
command[-pVv] команда [аргументы...]
Выполняет команду с аргументом, пропуская функции оболочки.
Если у вас есть функция оболочки с именем ls и вы хотите
назвать так же команду, вы говорите 'command ls'. Опция -p
осуществляет использование переменной по умолчанию для
$PATH, что гарантирует нахождение всех стандартных сервисных программ.
Если обеспечиваются и опция -V, и опция -v, то выдается описание "команды". Опция -v вызывает одно слово, указывающую на команду или имя файла, использованные для вызова "ко манды", которую нужно вывести; опция -V вызывает более мно гословное описание.
declare [-frxi] [имя[=значение]]
Объявляет переменные и/или дает им атрибуты. Если не даны
имена, вместо них выводятся значения переменных. -f значит
использование только имен функций. -r говорит, что имена
должны только читаться. -x отмечает имена для экспорта. -i
рассматривает переменную как целое число; арифметическое вычисление (см. раздел 4.7) выполнено, когда переменной прис воено значение. При использовании + вместо - удаляется заме щающий атрибут. Использование функции declare делает имена
локальными, как при помощи команды local.
enable [n] [-a] [имя...]
Включает и выключает команды оболочки. Это позволяет ис пользовать команду диска, имеющую то же имя, что и встроен ная команда оболочки. Если используется n, то "имена" стано вятся запрещенными. В противном случае имена вводятся в дей ствие. Например, чтобы использовать бинарный поиск test с
помощью $PATH вместо встроенной команды оболочки, нужно
ввести 'enable -n test'. Опция -a предназначена для занесения в список каждой встроенной команды с пометкой, включена
она или нет.
help [шаблон]
Выводится вспомогательная информация о встроенных командах.
Если определен шаблон, help дает подробную информацию о всех
командах, совпадающих с шаблоном, в противном случае выводится список встроенных команд.
local имя[=значение]
Для каждого аргумента создается локальная переменная под
названием "имя" и ей дается "значение". local может использоваться только внутри функции: он заставляет перемен ную иметь видимый контекст, ограниченный этой функцией и ее
потомками.
type [-all] [-type | -path] [имя...]
Для каждого "имени" помечает, как оно должно интерпретиро ваться при использовании имени команды. Если используется
флаг type, type возвращает единственное слово - "alias",
"function", "builtin", "file", или "keyword", если имя псевдоним, функция оболочки, встроенная команда оболочки,
дисковый файл или зарезервированное оболочкой слово соответственно. Если используется флаг -path, type возвращает имя
дискового файла, или ничего, если type не должен возвратить
"file". Если используется флаг -all, возвращаются все места,
содержащие выполнимый названный файл. Псевдонимы и функции
включаются если и только если флаг -path также не использует ся.
ulimit [acdmstfpnuvSH] [предел]
Ulimit проводит контроль за источниками, используемыми для
начальных процессов в оболочке,в системах, которые допускают
такой контроль. Если дана опция, она интерпретируется следующим образом:
изменяет и сообщает гибкий предел, связанный с источником (по умолчанию, если не дана опция -H).
изменяет и сообщает твердый предел, связанный с источником.
сообщает все текущие пределы.
максимальный размер созданного файла оперативной памяти.
максимальный размер сегмента данных процесса.
максимальный размер резидентного набора.
максимальный размер стека.
максимальное время cpu в секундах.
максимальный размер файла, созданного оболочкой.
максимальный размер канального буфера.
максимальное число открытых файловых дескрипторов.
максимальное число процессов, доступных отдельному пользователю.
максимальное количество виртуальной памяти, доступное процессу.
Зта встроенная команда настолько перегружена, что ей посвящается целый раздел.
set [abefhkmnptuvxldCHP] [-o опция] [аргумент]
отмечает переменные, которые модифицированы или созданы для зкспорта.
вызывает прекращение фоновых заданий, о котором сообщает перед выводом следующего базового приглашения.
немедленный выход, если выходное состояние команды ненулевое.
выключает генерацию имени файла (глоббирование).
обнаруживает и запоминает (хеширует) команды как определенные функции до того, как функция будет выполнена.
В окружении команды располагаются все аргументы ключевых слов, не только те, которые предшествуют имени команды.
Разрешается управление заданиями (см. главу 5).
Читает команды, но не выполняет их.
Устанавливает флаг, соответствующий имени_опции.
то же, что -а.
оболочка должна выполнить brace-расширение (см. раздел 2.2).
использует интерфейс редактирования emacs (см. главу 7 "Редактирование командной строки").
то же, что -е.
то же, что -Н.
оболочка не выходит при чтении EOF.
позволяет вызывать слово, начинающееся с '#', и все оставшиеся символы на этой строке игнорировать в диа логовой оболочке.
то же, что -m.
то же, что -C.
то же, что -n.
то же, что -f.
то же, что -d.
то же, что -b.
то же, что -u.
то же, что -P.
изменяет режим Bash в соответствии со стандартом Posix 1003.2, когда операция по умолчанию отличается от него. Предназначен для того, чтобы сделать режим строго подчиненным зтому стандарту.
то же, что -p.
то же, что -v.
использует интерфейс редактирования строки редактора vi.
то же, что -x.
Включает привилегированный режим. В зтом режиме файл $ENV не выполняется, и функции оболочки не наследуются из среды. Зто включается автоматически начальными действиями, если идентификатор зффективного пользователя (группы) не равен идентификатору реального пользователя (группы). Выключение зтой опции присваивает идентификатор зффективного пользователя (группы) идентификатору реального пользователя (группы).
выход после чтения и выполнения команды.
во время замещения рассматривает незаданную переменную как ошибку.
выдает строки ввода оболочки по мере их считывания.
выводит команды и их аргументы по мере выполнения команд.
сохраняет и восстанавливает связывание имени в команде for.
Выключает хеширование команд, найденных для выполнения. Обычно команды запоминаются в хеш-таблице и, будучи однажды найденными, больше не ищутся.
не позволяет существующим файлам перенаправление вывода.
закрывает замену стиля ! истории. Этот флаг принимается по умолчанию.
Если установлена, не следует символьному указателю при выполнении команды типа cd, которая изменяет текущий каталог. Вместо этого используется физический каталог.
Если нет аргументов, следующих за зтим флагом, то не задаются позиционные параметры. В противном случае позиционные параметры присваиваются аргументам, даже если некоторые из них начинаются с а-.
Сигнал конца опции, вызывающей присваивание оставшихся аргументов позиционным параметрам. Опции -x и -v выключаются. Если здесь нет аргументов, позиционный параметр не изменяется.
Эти переменные задаются и используются Bash, но в других оболочках обычно специально не рассматриваются.
При присвоении значения 'ignorespace' строки, начинающиеся с пробела или табуляции, не вводятся в список истории. При присвоении значения 'ignoredups' строка, соответствующая прошлой введенной строке, не вводится. 'ignoreboth' сочетает эти две опции. Присвоение любого другого значения обозначает сохранение всех строк в списке "истории".
Имя файла, хранящего команду истории.
Если задана, это максимальное число команд, которые должны быть запомнены в истории.
Восходит к трем символам, контролирующим расширение истории, быстрое замещение и лексемизацию (см. раздел 6.1 "Диалог истории"). Первый символ - символ расширения истории, обозначающий начало расширения истории - обычно '!'. Второй обозначает быструю замену при нахождении первого символа на строке, обычно '^'. Опционный третий символ помечает остаток строки - комментарий, когда он найден как первый символ слова, обычно '#'. Символ комментария истории вызывает замену истории, игнорируемую для оставшихся слов на строке. Не обязательно вызывает синтаксический разбор оболочки для рассмотрения остатка строки как комментария.
Номер истории или индекс списка истории текущей команды. Если HISTCMD не задана, она теряет свои специальные свойства, даже если впоследствии она опять задается.
Содержит имя файла в том же формате, что и '/etc/hosts', которое должно считываться, когда оболочке нужно завершить hostname. Вы можете иэменить файл в диалоговом режиме. В следующий раз, когда вы попытаетесь завершить hostname, Bash добавит содержание файла к уже существующей базе данных.
Показывает, как часто (в секундах) оболочка должна проверять файлы, указанные в MAILPATH, на наличие почты.
Если есть, содержит строку с командой для выполнения перед выводом каждой базовой команды приглашения ($PS1).
Числовой идентификатор реального пользователя для текущего пользователя.
Числовой идентификатор зффективного пользователя для текущего пользователя.
Строка, описывающая машину, на которой запущен Bash.
Cтрока, описывающая операционную систему, в которой запущен Bash.
Разделенный двоеточиями список суффиксов, игнорируемых при завершении имени файла. Имя файла, чей суффикс соответствует одному из приведенных в FIGNORE, извлекается из списка соответствующих имен файлов. Образцовое значение - '.o:~'.
Имя файла начальных действий Readline, заменяемое по умолчанию на '~/.inputrc'.
Имя версии текущего зкземпляра Bash.
Контролирует получение символа EOF оболочкой в отдельном вводе. Если задана, то ее значение - число последовательных символов EOF, которые могут быть считаны как первые символы строки ввода перед выходом из оболочки. Если переменная существует, но не имеет числового значения, то по умолчанию зто 10. Если переменная не существует, EOF отмечает конец ввода в оболочку. Действует только в диалоговых оболочках.
Если эта переменная существует, то оболочка не выходит, если она не может выполнить файл, указанный в команде exec.
Если есть, говорит о том, что не нужно следовать символическим указателям в командах, изменяющих текущий рабочий каталог. По умолчанию Bash следует по логической цепи каталогов при выполнении команд таких как cd, изменяющая рабочий каталог. Например, если '/usr/sys/' - указатель на '/usr/local/sys', то:
$ cd/usr/sys; echo $PWD
/usr/sys
$ cd..; pwd
/usr
Если nolinks существует, то:
$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd /usr/local
См. также описание опции -p встроенной команды set, раздел 4.5.
Оболочка позволяет вычислять арифметические выражения как одно из расширений оболочки или с помощью встроенной команды let.
Вычисления производятся в longint без проверки на переполнение, хотя деление на 0 прерывается и отмечается как ошибка. Нижеследующий список операторов сгруппирован по уровням равноприоритетных операторов. Уровни располагаются в порядке уменьшения приоритета.
унарные минус и плюс
логическое и поразрядное отрицания
умножение, деление, остаток
сложение и вычитание
левый и правый поразрядные сдвиги
сравнение
равенство и неравенство
поразрядное И
поразрядное исключительное ИЛИ
поразрядное ИЛИ
логическое И
логическое ИЛИ
распределение по приоритету.
Переменные оболочки допустимы как операнды; параметрическое расширение выполняется перед вычислением выражения. Значение параметра внутри выражения обязательно longint. Переменная оболочки не обязана иметь целый атрибут, включаемый в выражение.
Константы, начинающиеся с 0, интерпретируются как восьмиричные числа. Начало 0x или 0X обозначает шестнадцатиричное число. Кроме того, числа в форме [основание#]n, когда основание - десятичное число от 2 до 36, представляющее арифметическое основание системы счисления, а n - число в зтой системе. Если основание не указано, подразумевается 10.
Операторы вычисляются в порядке приоритета. Субвыражения в круглых скобках вычисляются первыми и могут не подчиняться правилам приоритета.
Арифметическое расширение позволяет вычислять арифметические выражения и подставлять результат. Существуют два формата арифметического расширения:
$[ выражение ]
$(( выражение ))
Выражение рассматривается, как если бы оно было заключено в двойные
кавычки, но двойные кавычки внутри фигурных или круглых скобок специально не рассматриваются. Все лексемы в выражении подвергаются параметрическому расширению, командному замещению и устранению кавычек.
Арифметические подстановки могут вкладываться одна в другую.
Вычисление выполняется согласно вышеуказанным правилам. Если выражение некорректно, Bash выдает сообщение, обозначающее сбой, и замещение невозможно.
let выражение [выражение]
Встроенная команда let позволяет выполнять арифметические
действия над переменными оболочки. Каждое выражение вычисляется согласно приведенным ранее правилам (см. раздел
4.7.1). Если последнее вычисление равно 0, let возвращает 1,
в противном случае - 0.
Значение переменной $PROMPT_COMMAND проверяется непосредственно перед выдачей Bash каждого базового приглашения. Если оно задано и не ноль, то значение выводится, как если бы оно было напечатано на командной строке.
Приведенная таблица описывает специальные символы, которые могут появляться в переменной PS1:
время в формате часы: минуты: секунды.
Дата в формате день_недели месяц число.
перевод строки.
имя оболочки, базовое имя $0 (участок, следующий за конечным /)
текущий рабочий каталог
базовое имя $PWD
имя пользователя, под которым вы эарегистрированы
hostname
номер зтой команды
номер истории зтой команды
символ, соответствующий восьмиричному числу nnn
если зффективный uid=0, то #, иначе $.
обратная косая черта (backslash)
начало последовательности невыводимых символов. Может использоваться для осуществления управления терминалом в приглашении.
конец последовательности невыводимых символов.
В этой главе рассматривается, что такое управление заданиями, как оно работает и как Bash осуществляет доступ к его средствам.
Управление заданиями относится к способности избирательной остановки (приостановки) выполнения процессов и продолжению их выполнения позже. Обычно пользователь использует зто средство с помощью диалогового интерфейса, применяемого совместно с системным драйвером терминала и Bash.
Оболочка связывает задание с каждым конвейером. Она содержит таблицу текущих выполняемых заданий, которые могут быть внесены в список с помощью команды jobs. Когда Bash начинает работу асинхронно (в фоновом режиме), он выдает строку типа
[1] 25647
обозначающую, что задание имеет номер 1, и идентификатор последнего
процесса конвейера, связанного с этим процессом, равен 25647. Все процессы отдельно взятого конвейера принадлежат одному и тому же заданию.
Вash использует абстрактное понятие "задание" как основу управления
заданиями.
Для облегчения использования интерфейса пользователя в управлении заданиями система содержит понятие идентификатора группы текущего процесса терминала (ИГТПТ). Члены зтой группы процесса (процессы, идентификатор группы которых равен ИГТПТ), получают генерированные клавиатурой сигналы, такие как SIGINT. Зти процессы должны быть приоритетными. Фоновые процессы - это процессы, идентификаторы группы которых отличаются от ИГТПТ: такие процессы не воспринимают сигналы клавиатуры. Только приоритетные процессы позволяют чтение с терминала или запись на него. При попытке фонового процесса что-либо прочесть с терминала или записать на него его драйвер посылает сигнал SIGTTIN (SIGTTOU), который, будучи получен, останавливает процесс.
Если операционная система, в которой выполняется Bash, предполагает управление заданиями, Вash позволяет его осуществить. Набрав символ приостановки (обычно '^Z', control-Z) во время выполнения процесса, можно вызвать остановку процесса и возврат в Bash. При наборе символа задержанной приостановки (обычно '^Y', control-Y) вызывается остановка во время попытки считать ввод с терминала, и управление возвращается в Bash. Можно манипулировать постановкой зтого задания, используя команду bg для продолжения фонового процесса, fg - для продолжения приоритетного или kill для прекращения. '^Z' действует мгновенно и имеет дополнительный зффект - вывод отложенного вывода и сброс печатающей головки.
Есть ряд способов ссылок на задание в оболочке. Символ % представляет имя задания. На задание с именем n можно сослаться с помощью %n. На начало задания также можно сослаться при использовании префикса имени, а для попадания на командную строку - подстроки. Например, '%ce' ссылается на остановленное задание сe. При использовании '?ce' осуществляется ссылка на любое задание, содержащее 'се' в командной строке. Если префикс или подстрока соответствует более чем одному заданию, Bash сообщает об ошибке. Символы %% и %+ ccылаются на текущее задание оболочки - последнее задание, остановленное на переднем плане. На предыдущее задание можно сослаться с помощью '%-'. В выводе, относящемся к заданиям (вывод команды jobs), текущее задание всегда обозначается '+', а предыдущее задание - '-'.
Простым упоминанием задания можно вызвать его перенос на передний план. '%1' (синоним 'fg %1') - переносит 1 с фона на передний план. Аналогично, '%1&'(синоним 'bg %1&') - с переднего плана на фон.
Оболочка немедленно узнает об изменениях в состоянии задания. Обычно Bash ждет вывода приглашения перед сообщением об изменениях в состоянии задания, чтобы не прерывать какой-либо другой вывод. Если задана опция -b встроенной команды set, то Bash cразу докладывает об изменениях (см. раздел 4.5). Зта возможность также контролируется переменной notify.
Если вы пытаетесь выйти из оболочки, пока задания остановлены, Bash печатает предостережение. Вы можете затем использовать команду jobs для проверки их состояний. Если вы зто делаете или пытаетесь сразу опять выйти, вас больше не предупреждают, и остановленные процессы завершаются.
bg [описание_задания]
Размещает описанное задания на заднем плане, как если бы
оно начиналось с '&'. Если не дано описание_задания, используется текущее задание.
fg [описание_задания]
Переносит описанное задание на передний план и делает его
текущим. Если не дано описание задания, используется текущее задание.
jobs [-lpn] [описание_задания]
jobs -x команда [описание_задания]
Первая форма заносит в список активные задания. Опция -l,
кроме обычной информации, перечисляет идентификаторы процесса; опция -p заносит в список только идентификатор про цесса, ведущего в группе задания. Опция -n высвечивает
только те задания, которые изменили состояние после последнего использования команды jobs. Если дано описание_зада ния, вывод ограничивается информацией о задании. Если опи сание задания не дано, перечисляются состояния всех зада ний. Если используется опция -x, jobs заменяет любое зада ние, найденное в команде или аргументах, соответствующим
идентификатором группы процесса, и выполняет команду, пропуская ее аргументы и возвращая выходное состояние.
suspend [-f]
Ожидает выполнения зтой оболочки с момента получения сигна ла SIGGONT; опция -f предназначена для ожидания даже в том
случае, если зто login-оболочка.
Зта переменная контролирует проведение оболочкой диалога с пользователем и управление заданиями. Если она существует, то односложные простые команды без переназначений рассматриваются как кандидаты на возобновление существующего зада ния. Здесь не допускается двойственности: если у вас есть более одного задания, начинающегося с набранной вами строки, то будет выбрано самое недавнее по времени задание. Имя остановленного задания в этом контексте есть командная строка, используемая для его начала. Если переменной присваивается значение exact, то используемая строка должна точно соответствовать имени остановленного задания; если значение substring, то используемая строка должна соответствовать подстроке имени остановленного задания. Значение substring обеспечивает функциональность аналогично идентификатору задания %? (см. раздел 5.1). Если присваивается любое другое значение, используемая строка должна быть префиксом имени остановленного задания: зто обеспечивает фун кциональность аналогично идентификатору задания %.
присвоение переменной значения зквивалентно 'set-b', ее исключение зквивалентно 'set+b' (см. раздел 4.5 "Встроенная команда set").
В зтой главе описывается, как использовать библиотеку истории GNU в диалоговом режиме со стандартного места пользователя. Для получения информации об использовании библиотеки истории GNU в ваших программах см. руководство для пользователя библиотекой Readline GNU.
Библиотека истории обеспечивает возможности расширения истории, подобные тем, что обеспечиваются csh. Нижеследующее описывает синтаксис, используемый для манипулирования информацией истории.
Расширение истории состоит из двух частей. Первая определяет, какая строка предыдущей истории будет использоваться во время замены. Вторая выбирает фрагменты зтой строки для включения в текущую. Строка, выбранная из предыдущей истории, называется событием, а выбранные затем фрагменты этой строки называются словами. Строка разбита на слова так же, как и в Bash, и эти английские слова (или слова Unix) берутся в кавычки и рассматриваются как одно слово.
Обозначение события - ссылка на командную строку, занесенную в список истории.
начинает замену истории, за исключением случая, когда следует после пробела, табуляции, =, ( или в начале новой строки.
ссылается на предыдущую команду. Это синоним !-1.
ссылается на командную строку n.
ссылается на команду, расположенную n строк назад.
cсылается на самую новую по времени команду, начинающуюся со "строки".
cсылается на самую новую команду, содержащую "строку".
вся командная строка, напечатанная в то время.
Быстрая замена. Повторяет последнюю команду, заменяющую строку1 строкой2. Зквивалентно !!:s/string1/string2/.
А: отделяет упоминание события от обозначения слова. Может пропускаться, когда обозначение слова начинается с a^, $, * или %. Cлова пронумерованы с начала строки начиная с первого слова (т.н. нулевого).
нулевое слово - командное слово для большинства приложений.
n-e слово.
первый аргумент - слово номер 1.
последний аргумент.
слово, соответствующее самому последнему поиску ?string?.
ряд слов: -y является cокращением 0-y.
Все слова, за исключением 0-го. Зто синоним 1-$. Не является ошибкой использование *, даже если в событии всего одно слово. В зтом случае возвращается пустая строка.
сокращение x-$.
то же, что x-$ и x*, но ислючается последнее слово.
К опционному обозначению слова можно добавить один или более следующих модификаторов, каждому из которых предшествует а:
удаляет конечный компонент составного имени, оставляя только начало.
удаляет конечный суффикс, оставляя основное имя.
удаляет все, кроме конечного суффикса.
удаляет все ведущие компоненты составного имени, оставляя хвост.
выводит новую команду, но не выполняет ее.
заключает в кавычки замененные слова во избежание дальнейших присваиваний.
заключает в кавычки замененные слова, как при поммощи q, но входит в слова на табуляциях, пробелах и в начале новой строки.
Заменяет new на первое появление old в строке события. На месте / можно использовать любой разграничитель. Он должен быть заключен между old и new с помощью единственного backslash. Если в new возникает &, он заменяется на old. Единственный backslash заключает &. Конечный разграничитель опционный, если зто последний символ строки ввода.
Повторяет предыдущее присваивание.
Вызывает изменения не только в одной строке событий. Используется в сочетании с s, как в gs/old/new/, или с &.
В этой главе описаны основные возможности интерфейса редактирования командной строки GNU.
В следующих разделах описывается нотация, используемая для представления нажатия клавиш.
Текст С-К читается 'контрол-к' и описывает символ, получающийся при нажатии на клавиши Control и K.
Текст М-К читается 'мета-к' и описывает символ, получающийся при нажатии на клавиши Meta (если таковая имеется) и K. Если у вас нет клавиши Meta, тот же результат можно получить при нажатии ESC K. И то, и другое называется метафированием клавиши К.
Текст М-С-К читается мета-контрол-к и описывает символ, получающийся при метафировании С-К.
Некоторые клавиши имеют собственные названия, их так и обозначают в тексте или инициальном файле (см. раздел 7.3): DEL, ESC, LFD, SPC, RET и TAB.
Часто во время сеанса диалога вы печатаете длинную строку только для того, чтобы потом заметить, что в первом слове есть ошибка. Библиотека чтения строки дает вам множество команд для манипулирования текстом при его наборе, позволяющих не перенабирать большую часть строки, а фиксировать набранное вами. Используя зти команды редактирования, вы перемещаете курсор на место, нуждающееся в коррекции и уничтожаете лишнее или вставляете недостающее. Затем, если вы удовлетворены этой строкой, вы просто нажимаете RETURN. Для этого необязательно находиться на конце строки: воспринимается целая строка вне зависимости от положения на ней курсора.
Для включения символов чтения строки нужно просто их набрать. Набранный символ возникает на месте курсора, а затем курсор перемещается на один пробел вправо. Если вы неправильно набрали символ, можно использовать erase для возвращения и уничтожить неправильно набранный символ.
Иногда бывает, что вы неправильно набрали символ и заметили зто только после того, как набрали еще несколько символов. В таком случае наберите С-В для передвижения курсора влево и исправьте свою ошибку. После зтого вы можете передвинуть курсор обратно с помощью C-F.
Если вы добавляете текст в середину строки, вы замечаете, что символы справа от курсора сдвигаются, чтобы освободить место для вводимого вами текста. Так же, когда вы уничтожаете текст сзади от курсора, символы справа сдвигаются, чтобы заполнить освободившееся место.
Список основных средств редактирования строки:
передвигается назад на один символ.
передвигается вперед на один символ.
уничтожает символ, стоящий на курсоре.
вставка символа в строку на месте курсора.
Отменяет последнее ваше действие. Вы можете отменить последовательно с конца все действия вплоть до чистой строки.
передвигается на начало строки.
передвигается на конец строки.
передвигает вперед слово.
передвигает назад слово.
очищает зкран и печатает сверху текущую строку.
Уничтожить текст - значит удалить его со строки, но сохранить для дальнейшего использования: обычно с помощью т.н. янкирования (перевставления) он возвращается на строку. Если в описании команды сказано, что она уничтожает текст, можете быть уверены, что вы получите его назад на другом (или на том же) месте позже.
Если вы используете команду уничтожения, текст сохраняется в "кольце уничтожения" (kill-ring). При любом количестве последовательных уничтожений весь уничтоженный текст сохраняется в одном месте, таким образом, когда вы хотите его янкировать, вы получаете его весь. В kill-ring не указывается строка: текст, набранный на строке и затем уничтоженный, можно янкировать и позже, после набора следующей строки.
Список команд для уничтожения текста.
Уничтожает текст от курсора до конца строки.
Уничтожает символы от курсора до конца слова или, если курсор между словами, до конца следующего слова.
Уничтожает символы от курсора до начала слова или, если курсор между словами, до начала предыдущего слова.
Уничтожает символы от курсора до предыдущего пробела. Отличается от M-DEL, поскольку слова могут ограничиваться по-разному.
Янкирует последний уничтоженный текст назад на место курсора.
Вращает kill-ring и янкирует новое. Вы можете это сделать, только если предыдущая команда была C-Y или M-Y.
Вы можете превратить числовые аргументы в команды чтения строки. Иногда аргумент действует как счетчик повторений, иногда - как отмечаемый знак аргумента. Если вы превращаете отрицательный аргумент в команду, действие которой обычно направлено вперед, то действие полученной команды будет направлено назад. Например, чтобы уничтожить текст до начала строки, вы можете набрать М--С-К.
Общий способ превращения числовых аргументов в команду такой: набрать метафированные символы перед командой. Если первый символ, который вы набрали - знак минус, то аргумент будет отрицательный. Теперь, когда вы набрали один символ Meta для запуска аргумента, вы можете набрать остальные символы, а затем команду. Например, для того чтобы подать команду C-D на аргумент 10, вы можете набрать M-10 C-D.
Хотя библиотека Readline используется вместе с похожими на Emacs связями клавиш, устанавливаемыми по умолчанию, возможно, вы захотите использовать другое множество связей клавиш. Вы можете настроить программы, использующие Readline, на помещение команд в инициализационный файл вашего домашнего каталога. Имя зтого файла берется из значения переменной INPUTRC оболочки. Если зта переменная не задана, по умолчанию предполагается '~/.inputrc'.
Когда запускается программа, использующая библиотеку Readline, читается инициализационный файл и задаются связи клавиш.
Команда C-x С-r считывает заново инициализационный файл, таким образом учитываются все изменения, которые вы могли туда внести.
Существует несколько основных конструкций, допустимых в инициализационном файле Readline. Пустые строки игнорируются. Строки, начинающиеся с #, считаются комментариями. Строки, начинающиеся с $, обозначают условные конструкции (см.раздел 7.3.2 "Инициализационные условные конструкции"). Остальные переменные обозначают задания переменных и связи клавиш.
Вы можете изменить состояние некоторых переменных в Readline с помощью использования команды set внутри инициализационного файла. Ниже показывается, как использовать команду редактирования строки vi:
set editing-mode vi
Есть несколько переменных, которые можно теперь задать - так мало,
что мы их перечислим.
Переменная editing-mode проверяет, какой режим редактирования используется. По умолчанию Readline включается в режиме редактирования Emacs - наиболее простом. Этой переменной можно присвоить emacs или vi.
Эта переменная может принимать значения On и Off. Значение On означает, что текст строк, которые вы редактируете, будет пропускаться горизонтально по одной строке зкрана, если их длина больше, чем ширина зкрана, вместо перенесения на следующую строку. По умолчанию переменной присваивается Off.
Эта переменная при присвоении ей On помечает звездочкой (*) начала модифицированных строк истории. По умолчанию зто Оff.
Контролирует, что происходит, когда Readline хочет дать звуковой сигнал. Если ей присвоено none, Readline вообще не издает звука. Если visible, Readline использует звук по возможности. Если значение переменной - audible (по умолчанию), Readline пытается издать звук.
Строка для вставки в начало строки, когда выполняется команда vi-comment. Значение по умолчанию - #.
Если присвоено значение on, включается восьмибитный ввод (не будет удаляться восьмой бит из читаемого символа), соответствия которому требует терминал. Значение по умолчанию - off.
Если присвоено значение on, Readline переводит символы с восьмым битом в ключевую последовательность ASCII c помощью удаления восьмого бита и использования символа ESC, переводящего их в последовательность метапрефиксных ключей. По умолчанию принимает значение on.
Если присвоено значение on, Readline выводит символы с восьмым битом раньше, чем метапрефиксную последовательность. По умолчанию - off.
Количество возможных завершений, определяющее, когда у пользователя спрашивается, не хочет ли он посмотреть список возможностей. Если количество возможных завершений больше, чем значение переменной, Readline спрашивает пользователя, не хочет ли он их посмотреть, в противном случае они просто перечисляются. По умолчанию - 100.
Используется идея Readline текущей таблицы клавиш для команд, связанных с ними. Имена, принимаемые keymap: emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command и vi-insert. vi зквивалентно vi-command, еmacs emacs-standard. По умолчанию emacs. Также при умолчании keymap используется значение editing-mode.
Изменяет поведение функций завершения, принимаемое по умолчанию. Если присвоено значение on, слова, имеющие более одного возможного завершения, должны быть выведены перед звуковым сигналом. По умолчанию off.
Если присваивается on, при попытке Readline завершить слово выполняется тильдовое расширение. По умолчанию - off.
Cинтаксис связей клавиш в инициализационном файле очень прост. Прежде всего вы должны знать имя команды, которую хотите изменить. Следующие страницы содержат таблицы имен команд, связей клавиш по умолчанию и краткие описания того, что делают команды.
Как только вы узнаете имя команды, напишите имя ключа, двоеточие и имя команды в строке инициализационного файла. Имя клавиши можно написать разными способами, в зависимости от того, как вам удобней.
keyname: имя функции или макрокоманда
Кeyname - имя ключа, записанное по-английски. Например:
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: ">&output"
В вышеприведенном примере 'C-u' связано с функцией
universal-argument, и 'C-o' связано с выполнением макрокоманды, записанной на правой стороне (чтобы вставить текст '>&output' в строку.
keyseq: имя функции или макрокоманда.
Keyseq отличается от keyname в пределах строки, определяющей целую
последовательность ключей, заключенностью последовательности ключей в
двойные кавычки. Могут использоваться некоторые клавиши GNU Еmacs, как
в приведенном ниже примере, но специальные символьные имена не узнаются.
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": Function Key 1"
B приведенном примере 'C-u' ограничено функцией universal-argument
(так же, как в первом примере), 'C-x C-r' ограничено функцией
re-read-init-file, и 'ESC [1 1~' ограничено для вставки текста
'Function Key1'. Следующие escape-последовательности доступны для определения последовательностей клавиш:
control префикс
meta префикс
символ еscape
backslash
"
'
Readline обеспечивает средство, похожее по сути на возможности условной компиляции С-препроцессора,которые позволяют свяэывания клавиш и присваивания переменных в результате тестов. Ниже приведены три используемые управляющие команды синтаксического разбора:
Конструкция $if позволяет основывать связывания на режиме редактирования, использовать терминал или Readline. Текст теста расширяется до конца строки, и не требуется символов для его изоляции.
mode= - форма директивы $if, используемая для провер ки, в каком режиме находится Readline: emacs или vi. Это можно использовать для связи с командой 'set keymap', например, для установления связей в emacs-standard и emacs-ctlx, только если Readline начинается в режиме emacs.
Форма term= может использоваться для включения свяэей специфических терминальных клавиш, а иногда - для связывания вывода последовательности клавиш терминальными функциональными клавишами. Слово справа от = сравнивает ся с полным именем терминала а фрагментом терминально го имени перед первым знаком -. Это, например, позво ляет sun соответствовать и sun, и sun-cmd.
Конструкция application позволяет включать установки, зависящие от приложений. Каждой программе, использующей библиотеку Readline, присваивается имя приложения, и вы можете это проверить. Это можно использовать для связывания последовательностей клавиш с функциями, используемыми в специфических программах. Например, ни жеприведенная команда добавляет последовательность кла виш, эаключающих в кавычки текущее или предыдущее сло во Bash:
$if bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
Эта команда, как видно из предыдущего примера, завершает команду $if.
Команды ветви директивы $if выполняются, если тест дает ошибку.
Передвигается на начало текущей строки.
Передвигается на конец текущей строки.
Передвигает вперед символ.
Передвигает символ назад.
Передвигается вперед до конца следующего слова. Слова состоят из букв и цифр.
Передвигается назад к началу зтого или предыдущего слова. Слова состоят иэ букв и цифр.
Очищает экран и выводит текущую строку наверх.
Обновляет текущую строку. По умолчанию неограничено.
Принимает строку независимо от положения курсора. Если строка не пуста, добавляет ее в список истории согласно установ ке переменной HISTCONTROL. Если строка была строкой истории, возвращает ее в первоначальное состояние.
Передвигается вверх по списку истории.
Передвигается вниэ по списку истории.
Передвигается на первую строку истории.
Передвигается на конец ввода истории, т.е. на строку, которую вы вводите.
Воэрастающий поиск назад от текущей строки и продвижение вверх по истории.
Возрастающий поиск вперед от текущей строки и продвижение вниз по истории.
Поиск наэад от текущей строки и продвижение вверх по истории при использовании невоэрастающего поиска для применяемой строки.
Поиск вперед от текущей строки и продвижение вниз по истории при испольэовании невоэрастающего поиска для применяемой строки.
Поиск вперед по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.
Поиск назад по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.
Вставляет первый аргумент в предыдущую команду (обычно второе слово предыдущей строки). Если дан аргумент n, вставляет n-е слово предыдущей команды (слова в предыдущей команде нумеруются с нуля). Отрицательный аргумент вставляет n-е слово с конца предыдущей команды.
Вставляет последний аргумент в предыдущую команду ( последнее слово предыдущей строки). Если дан аргумент, делает то же, что yank-nth-arg.
Удаляет символ на месте курсора. Если курсор на начале строки, в которой нет символов, и последний набранный символ был не C-d, то воэвращает EOF.
Удаляет символ эа курсором. Числовой аргумент заставляет уничтожать символ (kill) вместо его простого удаления.
Добавляет ледующий напечатанный вами символ в строку. Это помогает вставить ключевую последовательность, например C-D.
Вставляет символ tab.
Передвигает символ перед курсором вперед за курсор, двигая курсор соответственно назад. Если место вставки - в конце строки, то переносит последние два символа строки. С отрицательными аргументами не работает.
Передвигает слово за курсором назад на место слова перед курсором, двигая курсор соответственно вперед.
Пишет текущее (или следующее) слово прописными буквами. При отрицательном аргументе заменяет предыдушее слово, но оставляет на месте курсор.
Пишет текущее (или следующее) слово строчными буквами. При отрицательном аргументе заменяет предыдущее слово, но оставляет на месте курсор.
Делает заглавным текущее (или следующее) слово. При отрицательном аргументе делает то же самое с предыдущим словом, но оставляет на месте курсор.
Уничтожает текст от текущего положения курсора до конца строки.
Уничтожает все в направлении назад до начала строки.
Уничтожает в направлении назад от курсора до начала текущей строки. Сохраняет уничтожаемый текст в kill-ring.
Уничтожает все символы на текущей строке, вне зависимости от положения курсора. По умолчанию неограничена.
Уничтожает символы от курсора до конца текущего слова, или между словами, до конца следующего слова. Границы слов такие же, как в forward-word.
Уничтожает слово позади курсора. Границы слов такие же, как в backward-word.
Уничтожает слово позади курсора, используя в качестве границы слова пробел. Уничтожаемый текст сохраняется в kill-ring.
Уничтожает все пробелы и табуляции вокруг точки. По умолчанию неограничена.
Янкирует вершину kill-ring в буфер на текущую позицию курсора.
Вращает kill-ring и янкирует новую вершину. Вы можете это сделать, только если предыдущая команда была yank или yank-pop.
Добавляет цифру к аргументу, уже собранному, или начинает новый аргумент. M- начинает отрицательный аргумент.
Каждый раз при выполнении зтой команды счетчик аргумент умножается на 4. Изначально счетчик аргумента равен 1, таким об разом его следующее значение - 4. По умолчанию это не связа но с ключом.
Пытается сделать завершение текста перед курсором. Это специфическая особенность приложения. В общем случае, если вы пе чатаете аргумент имени файла, вы можете сделать завершение имени файла; если вы печатаете команду, вы можете сделать завершение команды; если вы печатаете символ в GDB, вы можете сделать завершение символьного имени; если вы печатаете в переменной Bash, вы можете сделать завершение имени переменной, и т.д. Полный список доступных функций завершения см. в Bash manual page.
Выводит список возможных эавершений текста перед курсором.
Вставляет все возможные завершения текста перед точкой, которые могут быть сгенерированы с помощью possible-completions. По умолчанию не связано с клавишей.
Начинает сохранение символов, напечатанных в текущую макрокоманду клавиатуры.
Прекращает сохранение символов, напечатанных в текущую макрокоманду клавиатуры, и сохраняет определение.
Выполняет заново последнюю определенную макрокоманду клавиатуры таким образом, что символы появляются как при наборе их на клавиатуре.
Читает содержание вашего инициализационного файла и включает все связывания и обозначения переменных, найденные в нем.
Прекращает текущую команду редактирования и дает звуковой сигнал (подчиненный установке bell-style).
Выполняет команду, свяэанную с соответствующим символом передвижения вверх.
Метафирует следующий символ, который вы печатаете. предназначена для тех, у кого отсутствует клавиша meta. Набрать 'ESC f' - то же самое, что набрать 'M-f'.
Возрастающая отмена, при которой отдельно запоминается каждая строка.
Отменяет все изменения, произведенные на зтой строке. Здесь, как и при наборе undo, достаточно времени для возвращения назад к началу.
Выполняет тильдовое расширение на текущей строке.
Выдает все функции и связи их клавиш в поток вывода читаемой строки. Если используется числовой аргумент, вывод форматируется таким образом, чтобы стать частью файла inputrs.
Выводит информацию о версии текущего Bash.
Расширяет строку, как при чтении ее оболочкой. Выполняет расширения псевдонима и истории так же, как расширения слов обо лочки.
Выполняет расширение истории на текущей строке.
Синоним yank-last-arg.
Принимает текущую строку для выполнения и извлекает следующую по отношению к текущей строку из истории для редактирова ния. Все аргументы игнорируются.
В режиме редактирования vi вызывает переход в режим редактирования emacs, как при выполнении команды set -o emacs.
Хотя в библиотеке Readline нет полного набора функций редактирования vi, в ней достаточно средств для простого редактирования строки. Режим vi в Readline действует так же, как определенный в Posix 1003.2 стандарт.
Для диалогового перехода из режима редактирования Emacs в Vi и обратно можно использовать команды set -o emacs и set -o vi (см. раздел 4.5. "Встроенная команда set"). Readline по умолчанию находится в режиме emacs.
Когда вы вводите строку в режиме vi, вы уже находитесь в режиме "вставки", как если бы вы нажали 'i'. Нажатие ESC переводит вас в режим "команды", в котором вы можете редактировать текст строки с помощью стандартных клавиш движения режима vi: перемещаться к предыдущим строкам истории, используя 'k', к следующим - 'j' и т.д.