Bash - командный интерпретатор GNU Bourne

         

БИБЛИОТЕКА READLINE


Это библиотека, обрабатывающая входные данные при работе командного интерпретатора в интерактивном режиме, если при его вызове не была указана опция . По умолчанию, команды редактирования строки подобны используемым в редакторе emacs. Также предоставляется интерфейс для редактирования командной строки в стиле редактора vi. Для отключения возможности редактирования после запуска командного интерпретатора используются опции +o emacs или +o vi встроенной команды (см. раздел "" ниже).



Числовые аргументы


digit-argument (M-0, M-1, ..., M--)

Добавляет соответствующую цифру к уже накопленному аргументу или начинает новый аргумент. M-- начинает отрицательный аргумент.

universal-argument

Это еще один способ задания аргумента. Если после этой команды идет одна или несколько цифр, возможно, начинающихся со знака минус, эти цифры образуют аргумент. Если после команды идут цифры, повторное выполнение universal-argument завершает числовой аргумент, в противном случае - игнорируется. В качестве специального случая, если сразу после команды идет символ, отличный от цифры или знака минус, аргумент count для следующей команды умножается на четыре. Аргумент count первоначально имеет занчение 1, так что при первом выполнении получается четыре, затем - шестнадцать и так далее.



Добавление перенаправленного вывода


Такое перенаправление вывода приводит к открытию файла, имя которого получается в результате подстановок в слове, в режиме добавления через дескриптор файла n, или к добавлению в стандартный выходной поток (дескриптор файла 1) если n не указано. Если файл не существует, он создается.

Перенаправление вывода на добавление имеет следующий общий вид:

[n]>>слово



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


Оператор перенаправления

[n]<&слово

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

Оператор

[n]>&слово

используется аналогично для дублирования дескрипторов выходных файлов. Если n не указано, используется стандартный выходной поток (дескриптор файла 1). Если цифры в слове не задают дескриптор файла, открытого на запись, возникает ошибка перенаправления. В качестве специального случая, если n не указано и слово



после подстановок не представляет собой одну или несколько цифр, стандартный выходной поток и стандартный поток ошибок перенаправляются так, как было описано выше.



ФУНКЦИИ


Функция командного интерпретатора, определенная как было представлено ранее в разделе "", сохраняет под заданным именем последовательность команд для выполнения в дальнейшем. Функции выполняются в контексте текущего командного интерпретатора; для их интерпретации не создается новый процесс (сравните с выполнением сценария командного интерпретатора). При вызове функции ее аргументы становятся позиционными параметрами. Специальный параметр # обновляется, отражая это изменение. Позиционный параметр 0 не изменяется. Все остальные особенности среды выполнения командного интерпретатора у функции и вызывающей ее команды идентичны, только обработчик сигнала DEBUG (см. описание встроенной команды в разделе "" ниже) не наследуется.

Можно объявлять локальные переменные функции с помощью встроенной команды . Обычно переменные и их значения совместно используются функцией и вызвавшей ее командой.

Если в функции выполняется встроенная команда , эта функция завершается, и выполнение продолжается со следующей команды после вызова функции. Когда функция завершается, восстанавливаются значения позиционных параметров и специального параметра #, которые были до выполнения функции.

Имена и определения функций можно получить с помощью опции -f встроенных команд или . С опцией -F встроенные команды и будут выдавать только имена функций. Функции можно экспортировать, с помощью опции -f встроенной команды , так что они будут автоматически определены в порожденных командных интерпретаторах.

Функции могут быть рекурсивными. Глубина рекурсии не ограничена.



Горячие клавиши readline


Привязки клавиш в файле inputrc задаются с помощью простого синтаксиса. Необходимо указать только имя команды или текст макроподстановки, и горячие клавиши, с которыми его надо связать. Горячие клавиши можно задавать двумя способами: как символическое имя клавиши, возможно, с префиксом Meta- или Control-, или как комбинацию клавиш. При использовании формы имя_клавиши:имя_функции или макроподстановка, имя_клавиши просто задается на английском. Например:

Control-u: universal-argument

Meta-Rubout: backward-kill-word

Control-o: "> output"

В этом примере комбинация клавиш 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

"\e[11~": "Function Key 1"

В этом примере, комбинация клавиш 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 с помощью встроенной команды . Режим редактирования можно переключать в ходе интерактивной работы с помощью опции встроенной команды (см. раздел "" ниже).



Имена команд readline


Ниже представлен список имен команд и стандартные комбинации клавиш, к которым они привязаны. Имена команд, для которых не указана комбинация клавиш, по умолчанию ни к какой комбинации не привязаны.



Инициализация библиотеки readline


Библиотека readline настраивается с помощью команд в файле инициализации

(файл inputrc). В качестве имени этого файла берется значение переменной INPUTRC. Если эта переменная не установлена, используется стандартный файл, ~/.inputrc. При запуске программы, использующей библиотеку readline, файл инициализации читается и устанавливаются соответствующие переменные и горячие клавиши. В файле инициализации readline допускаются лишь несколько простых конструкций. Пустые строки игнорируются. Строки, начинающиеся символом #, являются комментариями. Строки, начинающиеся символом $, обозначают условные конструкции. Остальные строки обозначают установки горячих клавиш и присваивания значений переменным.

Стандартные горячие клавиши можно изменить в файле inputrc. Другие программы, использующие эту библиотеку, могут добавлять собственные команды и горячие клавиши.

Например, поместив в файл инициализации

M-Control-u: universal-argument

или

C-Meta-u: universal-argument

мы привязываем к комбинации клавиш M-C-u команду universal-argument библиотеки readline.

Распознаются следующие имена символов: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE и TAB. Кроме имен команд, библиотека readline позволяет привязывать к клавишам строки, которые будут вставляться при их нажатии (т.е. задвать макроподстановки).



Клавиатурные макросы


start-kbd-macro (C-x ()

Начинает запоминание набранных символов в текущий клавиатурный макрос.

end-kbd-macro (C-x ))

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

call-last-kbd-macro (C-x e)

Выполняет последний определенный клавиатурный макрос, выводя символы макроса так, как если бы они были введены с клавиатуры.



Команды для изменения текста


delete-char (C-d)

Удаляет символ в позиции курсора. Если текущая позиция - начало строки, в строке нет символов и последняя нажатая клавиша не привязана к команде delete-char, возвращает EOF.

backward-delete-char (Backspace)

Удаляет символ перед курсором. При указании числового аргумента сохраняет удаленный текст в кольцевом буфере (kill ring).

forward-backward-delete-char

Удаляет символ в позиции курсора, если куросор не в конце строки, - в этом случае удаляется символ перед курсором. По умолчанию эта команда ни к какой комбинации клавиш не привязана.

quoted-insert (C-q, C-v)

Добавляет следующий набранный символ буквально. Так можно вставлять, например, символы типа C-q.

tab-insert (C-v TAB)

Вставляет символ табуляции.

self-insert (a, b, A, 1, !, ...)

Вставляет набранный символ.

transpose-chars (C-t)

Переносит символ перед текущей позицией за текущую позицию. Текущая позиция также перемещается вперед на один символ. Если текущая позиция - конец строки, меняет местами два символа перед текущей позицией. Отрицательные аргументы не поддерживаются.

transpose-words (M-t)

Переносит предыдущее слово за слово, на котором (или после которого) стоит курсор. Курсор перемещается в конец перенесенного слова.

upcase-word (M-u)

Переводит в верхний регистр текущее (или следующее слово). Если указан отрицательный аргумент, переводит в верхний регистр предыдущее слово, но не меняет текущей позиции.

downcase-word (M-l)

Переводит в нижний регистр текущее (или следующее слово). Если указан отрицательный аргумент, переводит в верхний регистр предыдущее слово, но не меняет текущей позиции.

capitalize-word (M-c)

Начинает с прописной буквы текущее или следующее слово. Если указан отрицательный аргумент, начинает с прописной буквы предыдущее слово, но не меняет текущей позиции.



Команды для перемещения


beginning-of-line (C-a)

Перемещает курсор в начало текущей строки.

end-of-line (C-e)

Перемещает курсор в конец строки.

forward-char (C-f)

Перемещает курсор на один символ вперед.

backward-char (C-b)

Перемещает курсор на один символ назад.

forward-word (M-f)

Перемещает курсор на одно слово вперед. Слова состоят из алфавитно-цифровых символов (букв и цифр).

backward-word (M-b)

Переходит к началу текущего или предыдущего слова. Слова состоят из алфавитноцифровых символов (букв и цифр).

clear-screen (C-l)

Очищает экран, оставляя текущую строку вверху экрана. При указании аргумента обновляет текущую строку, не очищая экрана.

redraw-current-line

Обновляет текущую строку.



Команды для работы со списком истории


accept-line (Newline, Return)

Принимает строку, независимо от позиции курсора. Если эта строка - не пустая, добавляет ее в список истории в соответствии с состоянием переменной HISTCONTROL. Если строка представляет собой измененную строку из списка истории, то строка истории восстанавливается в исходное состояние.

previous-history (C-p)

Извлекает предыдущую команду из списка истории, возвращаясь к началу списка.

next-history (C-n)

Извлекает следующую команду из списка истории, направляясь к концу списка.

beginning-of-history (M-

Переходит к первой строке в списке истории.

end-of-history (M->)

Переходит к концу истории введенных команд, т.е. к текущей вводимой строке.

reverse-search-history (C-r)

Ищет команду среди предыдущих, начиная с текущей строки и продвигаясь, при необходимости, к началу списка истории. Этот поиск - инкрементный.

forward-search-history (C-s)

Поиск далее, начиная с текущей строки и продвигаясь, при необходимости, к концу списка истории. Этот поиск - инкрементный.

non-incremental-reverse-search-history (M-p)

Неинкрементный поиск введенной пользователем строки в обратном направлении, начиная с текущей строки.

non-incremental-forward-search-history (M-n)

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

history-search-forward

Поиск далее в списке истории строки символов от начала текущей строки до позиции курсора (текущей позиции). Этот поиск - не инкрементный.

history-search-backward

Поиск в обратном направлении в списке истории строки символов от начала текущей строки до позиции курсора (текущей позиции). Этот поиск - не инкрементный.

yank-nth-arg (M-C-y)

Вставляет первый аргумент предыдущей команды (обычно это второе слово предыдущей строки) в текущую позицию курсора. Если указан аргумент n, вставляет n-ное слово предыдущей команды (слова в предыдущей команде нумеруются с 0). Если аргумент - отрицательный, вставляется n-ное слово от конца предыдущей команды.

yank-last-arg (M-., M-_)


Вставляет последний аргумент предыдущей команды (последнее слово в предыдущей записи списка истории). Если указан аргумент, работает так же, как и команда yank-nth-arg. При последовательном вызове команды yank-last-arg выполняется проход в обратном направлении по списку истории, со вставкой последнего аргумента очередной строки.

shell-expand-line (M-C-e)

Выполняет подстановки в строке по аналогии с командным интерпретатором. Выполняются подстановки псевдонимов и команд из списка истории, а также подстановка слов. Описание подстановки команд из списка истории см. далее в разделе "".

history-expand-line (M-^)

Выполняет подстановку команд из списка истории в текущей строке. Описание подстановки команд из списка истории см. далее в разделе "".

magic-space

Выполняет подстановку команд из списка истории в текущей строке и добавляет пробел. Описание подстановки команд из списка истории см. далее в разделе "".

alias-expand-line

Выполняет подстановку псевдонимов в текущей строке. Описание подстановки псевдонимов см. ранее в разделе """.

history-and-alias-expand-line

Выполняет подстановки псевдонимов и команд из списка истории в текущей строке.

insert-last-argument (M-., M-_)

Синоним для команды yank-last-arg.

operate-and-get-next (C-o)

Принимает текущую строку для выполнения и извлекает следующую строку после текущей из списка истории для редактирования. Аргументы игнорируются.


Конструкция "документ здесь"


При этом типе перенаправления командный интерпретатор будет читать входные данные из текущего файла, пока не встретится строка, содержащая только указанное слово (без хвостовых пробелов). Все прочитанные до этого строки затем используются как стандартный входной поток для команды.

Конструкция "документ здесь" имеет следующий формат:

<<[-]слово

документ-здесь

ограничитель

В слове не выполняется подстановка значений параметров, результатов выполнения команд, имен файлов или вычисление арифметических выражений. Если в слове есть замаскированный символ, ограничитель является результатом удаления символов маскировки из слова. Если в слове нет замаскированных символов, во всех строках "документа здесь" выполняется подстановка значений параметров, результатов выполнения команд и вычисление арифметических выражений. В этом случае пара \<перевод строки> игнорируется, и необходимо использовать \ для маскировки символов \, $ и `.

Если в качестве оператора перенаправления используется <<-, то все начальные табуляции из входных строк и строки, содержащей ограничитель, удаляются. Это позволяет естственным образом выравнивать конструкции "документ здесь" в сценариях командного интерпретатора.



ОБРАБОТКА ПРОСТОЙ КОМАНДЫ


При обработке простой команды командный интерпретатор делает, слева направо, следующие подстановки, присваивания и перенаправления.

Слова, помеченные синтаксическим анализатором как присваивания переменным (те, что идут перед именем команды) и перенаправления, сохраняются для дальнейшей обработки.

В остальных словах выполняются подстановки и замены. Если после этого остались какие-то слова, первое из них считается именем команды, а остальные - ее аргументами.

Перенаправления выполняются так, как описано ранее в разделе "".

В тексте после = в каждом присваивании переменной перед присваиванием выполняется замена тильды, подстановка значений параметров, подстановка результатов выполнения команд и вычисление арифметических выражений, а также удаление кавычек.

Если в результате имени команды нет, присваивания переменным влияют на среду текущего командного интерпретатора. В противном случае, переменные добавляются в среду выполняемой команды и не влияют на среду текущего командного интерпретатора. Если происходит попытка присвоить значение переменной с атрибутом только для чтения, выдается сообщение об ошибке и команда завершается с ненулевым статусом выхода.

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

Если после подстановок имя команды осталось, выполнение продолжается так, как описано ниже. В противном случае, выполнение команды завершается. При этом если выполнялись подстановки результатов выполнения команд, статус выхода будет равен статусу последней команды, результаты которой были подставлены. Если подстановок результатов выполнения команд не было, команда завершается со статусом выхода ноль.



Открытие дескрипторов файлов для чтения и записи


Оператор перенаправления

[n]<>слово

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



Переменные readline


Библиотека readline поддерживает переменные, которые можно использовать для дополнительной настройки ее работы. Значение переменной можно установить в файле inputrc или с помощью оператора вида

set имя_переменной значение

За исключением явно указанных случаев, переменные readline могут иметь значения On или Off. Ниже представлены эти переменные и их стандартные значения:

bell-style (audible)

Управляет тем, что происходит, когда библиотека readline должна выдать звонок (звуковой сигнал) терминала. Если задано значение none, readline никогда не выдает звуковой сигнал. Если задано значение visible, readline использует визуальный сигнал, если он поддерживается терминалом. Если задано значение audible, readline пытается выдать звуковой сигнал терминала.

comment-begin ("#")

Строка, вставляемая при выполнении команды insert-comment библиотеки readline. Эта команда привязана к клавишам M-# в режиме emacs и к клавише # в режиме vi.

completion-ignore-case (Off)

Если установлено значение On, библиотека readline выполняет подстановку имен файлов и дополнение командной строки с учетом регистра.

completion-query-items (100)

Определяет, когда у пользователя запрашивают подтверждение выдачи всех завершений команды, генерируемых командой possible-completions. Можно задавать любое неотрицательное целочисленное значение. Если количество возможных завершений больше или равно значению этой переменной, у пользователя запрашивают, желает ли он все их увидеть; иначе они просто выдаются на терминал.

convert-meta (On)

Если установлено значение On, readline будет преобразовывать символы с установленным восьмым битом в последовательность символов ASCII путем сброса восьмого бита и добавления управляющего символа (фактически, используя управляющий символ как мета-префикс).

disable-completion (Off)

Если установлено значение On, readline не будет выполнять завершение слов. Символы завершения будут вставляться в строку буквально.

editing-mode (emacs)

Управляет тем, с каким набором горячих клавиш начинает работать библиотека readline - анаголичным emacs или vi. Переменная editing-mode может иметь значения emacs или vi.


enable-keypad (Off)

Если установлено значение On, readline будет пытаться включить поддержку цифрового блока клавиатуры справа при вызове. Некоторым системам это необходимо для поддержки клавиш со стрелками.

expand-tilde (Off)

Если установлено значение On, при попытке завершеная слов выполняется замена тильды.

horizontal-scroll-mode (Off)

Если установлено значение On, readline будет использовать одну строку для показа, прокручивая ее при необходимости в одной строке, когда ее длина превышает ширину экрана, а не перенося визуально на новую строку.

input-meta (Off)

Если установлено значение On, readline будет поддерживать ввод восьмибитовых символов (т.е. не будет сбрасывать старший бит символов при чтении), независимо от того, поддерживает ли восьмибитовые символы терминал. Имя meta-flag - синоним для данной переменной.

isearch-terminators ("C-[C-J")

Строка символов, которые должны прекращать инкрементный поиск без последующего выполнения символа как команды. Если значение этой переменной не задано, инкрементный поиск будут прекращать клавиши ESC и C-J.

keymap (emacs)

Устанавливает текущую раскладку горячих клавиш для readline. Допускаются имена раскладок emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command и vi-insert. vi эквивалентно vi-command; emacs эквивалентно emacs-standard. Стандартное значение - emacs; значение переменной editing-mode также влияет на горячие клавиши.

mark-directories (On)

Если установлено значение On, к завершенным именам каталогов добавляется косая черта.

mark-modified-lines (Off)

Если установлено значение On, перед строками списка истории команд, которые были изменены, выдается звездочка (*).

output-meta (Off)

Если установлено значение On, readline будет выдавать символы с установленным восьмым битом непосредственно, а не как управляющую последовательность, начинающуюся метасимволом.

print-completions-horizontally (Off)

Если установлено значение On, readline будет выдавать возможные завершения отсортированные в алфавитном порядке по горизонтали, в строках, а не по вертикали, в столбцах.

show-all-if-ambiguous (Off)

Изменяет стандартное поведение функций завершения. Если установлено значение On, для слов, имеющих более одного возможного завершения, список возможных выдается сразу, а не после звукового сигнала.

visible-stats (Off)

Если установлено значение On, к именам файлов при выдаче возможных завершений добавляется символ, задающий их тип в соответствии с функцией stat(2).


ПЕРЕНАПРАВЛЕНИЕ


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

В следующих описаниях если номер дескриптора файла не указан и первый символ оператора перенаправления - <, выполняется перенаправление стандартного входного потока (дескриптор файла 0). Если же первым символом оператора перенаправления является символ >, выполняется перенаправление стандартного выходного потока (дескриптор файла 1).

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

Учтите, что порядок указания перенаправлений имеет значение. Например, команда

ls > dirlist 2>&1

перенаправляет в файл dirlist стандартный выходной поток и стандартный поток ошибок, тогда как команда

ls 2>&1 > dirlist

перенаправляет в файл dirlist только стандартный выходной поток, поскольку стандартный поток ошибок был направлен туде же, куда и стандартный выходной поток до его перенаправления в файл dirlist.

Ошибка при открытии или создании файла приводит к отмене перенаправления.



Перенаправление стандартного выходного потока и стандартного потока ошибок


Командный интерпретатор bash позволяет перенаправить как стандартный выходной поток (дескриптор файла 1), так и стандартный поток ошибок (дескриптор файла 2) в файл, имя которого получается в результате подстановок в слове.

Для этого предлагается два формата конструкции перенаправления:

&>слово

и

>&слово

Первый формат является предпочтительным. Эта конструкция семантически эквивалентна следующей:

>слово 2>&1



Перенаправление входного потока


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

В общем случае перенаправление входного потока имеет вид:

[n]<слово



Перенаправление выходного потока


Перенаправление входного потока приводит к открытию на запись файла, имя которого получается в результате подстановок в слове, через дескриптор файла n, или как стандартного выходного потока (дескриптор файла 1), если n

не указано. Если файл не существует, он создается; если существует - он усекается до нулевого размера.

В общем случае перенаправление выходного потока имеет вид:

[n]>слово

Если используется оператор перенаправления > и с помощью встроенной команды set установлена опция , перенаправление не будет выполнено, если файл с соответствующим именем существует и является обычным файлом. Если используется оператор перенаправления >|, либо оператор перенаправления - > и опция noclobber с помощью встроенной команды не установлена, перенаправление выполняется, даже если соответствующий файл существует.



Поиск


Библиотека readline предлагает команды для поиска в списке истории команд (см. раздел "" ниже) строк, содержащих определенную подстроку. Имеется два режима поиска: инкрементный и не инкрементный.

Инкрементные поиски начинаются прежде, чем пользователь закончит ввод искомой строки. Привводе каждого символа искомой строки, readline выдает следующую запись из списка истории, соответствующую уже набранной подстроке. При инкрементном поиске достаточно ввести ровно столько символов, сколько надо для нахождения интересующей команды. Символы значения переменной isearch-terminators используются для завершения инкрементного поиска. Если значение этой переменной не задано, инкрементный поиск прерывается клавишами

Escape и Control-J. Нажатие Control-G прерывает инкрементный поиск и восстанавливает исходную строку. При завершении поиска, запись из списка истории, содержащая строку поиска, становится текущей строкой. Для поиска других соответствующих записей в списке истории, нажмите Control-S или Control-R, в зависимости от направления поиска. В результате, будет выполнен поиск в обратном или прямом направлении следующей записи, соответствующей уже набранному фрагменту строки. Ввод любой другой последовательности символов, привязанной к команде библиотеки readline, приводит к завершению поиска и выполнению команды. Например, нажатие клавиши Enter

завершит поиск и выполнит выбранную команду из списка истории.

При неинкрементом поиске перед началом поиска читается вся искомая строка. Искомая строка может быть набрана пользователем или быть частью содержимого текущей строки.



ПРИГЛАШЕНИЯ


При интерактивной работе командный интерпретатор 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ршение последовательности непечатных символов

Порядковый номер команды и порядковый номер команды в списке истории обычно различаются: порядковый номер в списке истории задает ее позицию в списке, который может содержать команды, прочитанные из файла истории (см. раздел "" далее), тогда как порядковый номер команды задает ее позицию в списке команд, выполненных в текущем сеансе командного интерпретатора. После декодирования строки приглашения в ней выполняется подстановка значений параметров, подстановка результатов выполнения команд, результатов вычисления арифметических выражений, подстановка строк и удаление кавычек, в зависимости от значения опции командного интерпретатора

(см. описание команды в разделе "" далее).



Прочие команды


re-read-init-file (C-x C-r)

Перечитывает содержимое файла inputrc и учитывает все указанные в нем привязки клавиш и значения переменных.

abort (C-g)

Прерывает текущую команду редактирования и выдает сигнал терминала (вид сигнала задается командой bell-style).

do-uppercase-version (M-a, M-b, M-x, ...)

Если символ x, введенный вместе с клавишей Meta, является символом нижнего регистра, выполнить команду, привязанную к соответствующему символу в верхнем регистре.

prefix-meta (ESC)

Рассматривать следующий введенный символ как предваренный клавишей Meta. ESC f эквивалентно Meta-f.

undo (C-_, C-x C-u)

Инкрементная отмена, запоминаемая отдельно для каждой строки.

revert-line (M-r)

Отмена всех изменений текущей строки. Аналогично выполнению команды undo несколько раз до возвращения строки в исходное состояние.

tilde-expand (M-&)

Выполняет замену тильды в текущем слове.

set-mark (C-@, M-<space>)

Устанавливает метку в текущей позиции. Если задан числовой аргумент, метка устанавливается в соответствующей позиции.

exchange-point-and-mark (C-x C-x)

Меняет местами метку и текущую позицию. Текущей позицией курсора становится запомненная в метке, а прежняя позиция курсора запоминается в метке.

character-search (C-])

Читается символ, и курсор переводится на следующее вхождение этого символа. Отрицательный аргумент означает поиск предыдущего вхождения.

character-search-backward (M-C-])

Читается символ, и курсор переводится на предыдущее вхождение этого символа. Отрицательный аргумент означает поиск следующего вхождения.

insert-comment (M-#)

Значение переменной comment-begin библиотеки readline вставляется в начало текущей строки, и строка принимается, как если бы была нажата клавиша Enter. В результате, текущая строка становится комментарием

командного интерпретатора.

glob-expand-word (C-x *)

Слово перед текущей позицией рассматривается как шаблон имен файлов и вместо него вставляется список соответствующих имен файлов.

glob-list-expansions (C-x g)


Выдается список имен файлов, генерируемых командой glob-expand-word, а затем снова исходная строка.

dump-functions

Выдает все функции и комбинации клавиш, к которым они привязаны, в выходной поток readline. Если задан числовой аргумент, результат форматируется так, что его можно непосредственно включить в файл inputrc.

dump-variables

Выдает все изменяемые переменные readline вместе с их значениями в выходной поток readline. Если задан числовой аргумент, результат форматируется так, что его можно непосредственно включить в файл inputrc.

dump-macros

Выдает все комбинации клавиш readline, привязанные к макросам, и строки, которые выдаются при их нажатии. Если задан числовой аргумент, результат форматируется так, что его можно непосредственно включить в файл inputrc.

display-shell-version (C-x C-v)

Выдает информацию о версии текущего экземпляра командного интерпретатора bash.

                     


ПСЕВДОНИМЫ


Псеводнимы позволяют подставлять вместо первого слова простой команды строку. Командный интерпретатор поддерживает список псевдонимов, которые можно устанавливать и удалять с помощью встроенных команд и (см. раздел "" ниже). Первое слово каждой команды, если оно не взято в кавычки, ищется в списке псевдонимов. Если соответствующий псевдоним найден, слово заменяется текстом псевдонима. Имя псевдонима и подставляемый текст может включать любые допустимые входные данные для командного интерпретатора, включая перечисленные ранее метасимволы. Единственное исключение - имя псевдонима не может содержать знак =. Первое слово текста псевдонима также ищется в списке псевдонимов, но если оно совпадает с именем подставляемого псевдонима, повторной подстановки не происходит. Это означает, что можно задать псевдоним ls для ls -F, например, и bash не будет пытаться выполнять рекурсивные подстановки в тексте псевдонима. Если последний символ текста псевдонима - пробел, следующее за псевдонимом слово исходной команды также ищется в списке псевдонимов и, если найдено, заменяется.

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

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

Псевдонимы не подставляются, если командный интерпретатор не является интерактивным, если только с помощью встроенной команды не установлена опция (см. описание команды ниже, в разделе "").

Правила определения и использования псевдонимов несколько запутаны. Командный интерпретатор bash всегда читает по крайней мере одну полную строку ввода, прежде чем выполнять любые указанные в ней команды. Псевдонимы подставляются при чтении строки, а не при ее выполнении. Поэтому определение псевдонима, заданное в одной строке с другой командой, не учитывается, пока не будет прочитана следующая строка. Команды, идущие после определения псевдонима в той же строке, этот новый псевдоним не учитывают. Это поведение также необходимо учитывать при выполнении функций. Псевдонимы подставляются при чтении определения функции, а не при ее выполнении, поскольку определение функции само является составной командой. Как следствие, псевдонимы, определенные в функции, не доступны до тех пор, пока функция не выполнится. Для простоты, всегда задавайте определения псевдонимов в отдельной строке и не используйте команду в составных командах.

Практически все варианты использования псевдонимов покрываются функциями командного интерпретатора.



СИГНАЛЫ


Когда командный интерпретатор bash работает в интерактивном режиме, при отсутствии обработчиков сигналов, он игнорирует сигнал SIGTERM (так что команда не прекращает работу интерактивного командного интерпретатора), а сигнал SIGINT перехватывается и обрабатывается (так, что встроенная команда им не прерывается). Во всех случаях, bash игнорирует сигнал SIGQUIT. Если действует управление заданиями, bash игнорирует сигналы SIGTTIN, SIGTTOU и SIGTSTP.

У синхронных заданий, запущенных командным интерпретатором bash, устанавливаются обработчики сигналов, унаследованные командным интерпретатором от родительского процесса. Если управление заданиями не действует, асинхронные команды также игнорируют сигналы SIGINT и SIGQUIT. Команды, выполняемые для подстановки результатов выполнения, игнорируют сигналы управления заданиями SIGTTIN, SIGTTOU и SIGTSTP, посланные с клавиатуры.

По умолчанию командный интерпретатор завершает работу при получении сигнала SIGHUP. Перед завершением он посылает сигналы SIGHUP всем заданиям, как выполняющимся, так и остановленным. Остановленным заданиям предварительно посылается сигнал SIGCONT, гарантирующий получение ими сигнала SIGHUP. Для предотвращения послыки интерпретатором сигнала конкретному заданию, его необходимо удалить из таблицы заданий с помощью встроенной команды (см. раздел "" далее) или пометить как не получающие сигнал SIGHUP с помощью .

Если с помощью команды установлена опция командного интерпретатора , bash посылает сигнал SIGHUP всем заданиям при завершении работы интерактивного начального командного интерпретатора.

При получении командным интерпретатором bash сигнала, для которого установлен обработчик, в то время, когда ожидается завершение команды, обработчик не выполняется, пока команда не завершится. Когда bash ожидает завершения асинхронной команды с помощью встроенной команды , получение сигнала, для которого установлен обработчик, приводит к немедленному завершению встроенной команды со статусом выхода более 128 сразу же после выполнения кода обработчика.



Соглашения по записи команд readline


В этом разделе для записи нажимаемых клавиш используются соглашения в стиле редактора 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) приводит к ее применению к предшествующему тексту. Команды, работа которых отличается от описанной здесь, специально отмечены ниже.

Если команда удаляет текст, этот текст сохраняется для дальнейшего извлечения (вставки). Удаленый текст помещается в кольцевой буфер. Последовательные удаления пополняют буфер, формируя единицу вставки. Команды, не удаляющие текст, разделяют фрагменты в кольцевом буфере удаления.



СРЕДА


При вызове программы ей передается массив строк, который называют средой. Это список пар имя-значение вида name=value.

Командный интерпретатор позволяет манипулировать средой несколькими способами. При вызове командный интерпретатор просматривает свою среду и создает одноименный параметр для каждого имени, автоматически экспортируя его для порожденных процессов. Выполняемые команды наследуют среду. Команды и позволяют добавлять и удалять параметры и функции из среды. Если значение параметра, входящего в среду, изменено, новое значение становится частью среды, заменяя старое. Среда, наследуемая выполняемой командой, состоит из начальной среды командного интерпретатора, значения которой могли быть изменены в ходе его работы, за исключением пар, удаленных с помощью команды , и новых параметров, добавленных с помощью команд и .

Среда для любой простой команды или функции может быть временно дополнена путем задания перед именем присваиваний параметрам, как описано ранее в разделе "". Эти операторы присваивания влияют только на среду вызываемой команды.

Если установлена опция , (см. описание встроенной команды ниже), то все параметры с присвоенными при вызове значениями, а не только предшествующие имени команды, помещаются в ее среду.

Когда командный интерпретатор bash вызывает внешнюю команду, переменная _

устанавливается равной полному имени файла команды и передается этой команде в среде.



СРЕДА ВЫПОЛНЕНИЯ КОМАНД


У командного интерпретатора есть среда выполнения, содержащая следующие компоненты:

открытые файлы, унаследованные командным интерпретатором при вызове, с учетом изменений, вызванных перенаправлениями, переданными встроенной команде

текущий рабочий каталог, установленный командами , или , или унаследованный командным интерпретатором при вызове

маска режима создания файла, установленная с помощью команды или унаследованная от родительского процесса

текущие обработчики сигналов, установленные с помощью

параметры командного интерпретатора, установленные путем присваивания переменным или унаследованные из среды родительского процесса

функции командного интерпретатора, заданные в ходе выполнения или унаследованные из среды родительского процесса

опции, установленные при вызове (как стандартные, так и заданные явно в командной строке) или установленные с помощью комнады

опции, установленные с помощью команды

псевдонимы, заданные с помощью команды

идентификаторы различных процессов, в том числе, для фоновых заданий, значение параметра $$ и значение параметра $PPID

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

открытые файлы командного интерпретатора плюс любые изменения и дополнения, заданные для команды перенаправлениями

текущий рабочий каталог

маска режима создания файлов

переменные командного интерпретатора, помеченные как экспортированные, а также переменные, экспортированные для команды и переданные в среде

наследуются установленные в родительском командном интерпретаторе обработчики сигналов, а сигналы, в нем игнорировавшиеся, также игнорируются.

Команда, вызванная в этой отдельной среде, не может повлиять на среду выполнения родительского командного интерпретатора.

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



СТАТУС ВЫХОДА


С точки зрения командного интерпретатора, команда, завершившаяся со статусом выхода 0, сработала успешно. Статус выхода 0 означает успешное завершение. Ненулевой статус выхода означает неудачу. Если работа команды прервана сигналом, командный интерпретатор bash использует в качестве статуса выхода значение 128+сигнал.

Если команда не найдена, порожденный для ее выполнения процесс возвращает статус выхода 127. Если команда найдена, но не является выполняемой, возвращается статус выхода 126.

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

Встроенные команды интерпретатора возвращают статус 0 (истина) при успешном выполнении, и ненулевой статус (ложь), если при выполнении произошла ошибка. При некорректном использовании все встроенные команды возвращают статус 2.

Сам командный интерпретатор bash возвращает статус выхода последней выполненной команды, если только не обнаруживает синтаксическую ошибку. В этом случае он завершает работу с ненулевым статусом. См. также описание встроенной команды ниже.



Удаление и вставка


kill-line (C-k)

Удаляет текст от текущей позиции курсора до конца строки.

backward-kill-line (C-x Backspace)

Удаляет текст до начала строки.

unix-line-discard (C-u)

Удаляет текст от текущей позиции до начала строки. Удаленный текст помещается в кольцевой буфер.

kill-whole-line

Удаляет все символы текущей строки, независимо от позиции курсора.

kill-word (M-d)

Удаляет символы от курсора до конца слова или, если курсор стоит между словами, до конца следующего слова. Границы слов определяются так же, как и для команды forward-word.

backward-kill-word (M-Backspace)

Удаляет слово перед курсором. Границы слова определяются так же, как и в команде backward-word.

unix-word-rubout (C-w)

Удаляет слово перед курсором, используя в качестве ограничителя слов пробельные символы. Границы слова, таким образом, отличаются от принятых в команде backward-kill-word.

delete-horizontal-space (M-\)

Удаляет все пробелы и символы табуляции вокруг текущей позиции.

kill-region

Удаляет весь текст от текущей позиции до отметки (запомненной позиции курсора). Этот текст называют областью (region).

copy-region-as-kill

Копирует текст области в буфер.

copy-backward-word

Копирует слово перед текущей позицией в буфер. Границы слов определяются так же, как в команде backward-word.

copy-forward-word

Копирует слово после текущей позиции в буфер. Границы слов определяются так же, как в команде forward-word.

yank (C-y)

Вставляет верхний элемент кольцевого буфера в позиции курсора.

yank-pop (M-y)

Прокручивает кольцевой буфер и вставляет новый верхний элемент. Работает только после команды yank или yank-pop.



УПРАВЛЕНИЕ ЗАДАНИЯМИ


Управление заданиями - это возможность избирательно останавливать (приостанавливать) выполнение процессов и продолжать (возобновлять) их выполнение в дальнейшем. Пользователи обычно делают это через интерактивный интерфейс, совместно реализуемый драйвером терминала и командным интерпретатором bash.

Командный интерпретатор связывает задание с каждым конвейером. Он поддерживает таблицу выполняющихся заданий, которую можно просматривать с помощью команды . При запуске задания асинхронно (в фоновом режиме) bash выдает строку следующего вида:

[1] 25647

показывающую, что это задание с номером 1, а идентификатор последнего процесса в конвейере, связанном с данным заданием - 25647. Все процессы в одном конвейере являются частями одного задания. Командный интерпретатор bash

использует понятие задания как основу для управления заданиями.

Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT. Эти процессы называют приритетными (процессами переднего плана). Фоновые процессы - это те, идентификатор группы процессов которых не совпадает с терминальным; таким процессам сигналы с клавиатуры не посылаются. Только приоритетные процессы могут читать данные с терминала и выдавать данные в него. Фоновые процессы, пытающиеся читать с терминала (или выдавать в него данные) получают от драйвера терминала сигнал SIGTTIN (SIGTTOU), который, если не перехвачен, приостанавливает работу процесса.

Если операционная система, в которой работает bash, поддерживает управление заданиями, bash позволяет его использовать. При нажатии клавиши приостановки

(обычно ^Z, Control-Z) по ходу работы процесса, этот процесс останавливается и управление возвращается командному интерпретатору bash. При нажатии клавиши отложенной приостановки (обычно ^Y, Control-Y) процесс останавливается при попытке чтения данных с терминала, и управление возвращается командному интерпретатору bash. Затем пользователь может управлять состоянием этого задания, используя команду для его продолжения в фоновом режиме, команду - для продолжения в приоритетном режиме или команду для его прекращения. Нажатие ^Z срабатывает немедленно и имеет дополнительный побочный эффект в виде сброса данных, ожидающих вывода и ввода.


Командный интерпретатор поддерживает несколько способов сослаться на задание. Символ % означает начало имени задания. На задание с номером n можно сослаться как %n. На задание можно сослаться также с помощью префикса имени команды, использованной для его начала, или подстроки, входящей в соответствующую командную строку. Например, %ce ссылается на остановленное задание ce. Если префикс соответствует нескольким заданиям, bash выдает сообщение об ошибке. Обращение вида %?ce, с другой стороны, ссылается на любое задание, в командной строке которого содержится подстрока ce. Если эта подстрока содержится в нескольких заданиях, bash выдает сообщение об ошибке. Строки %% и %+ обозначают текущее задание командного интерпретатора - последнее задание, остановленное при работе в приоритетном режиме или запущенное в фоновом режиме. На предыдущее задание можно сослаться с помощью строки %-. В результатах работы команд, связанных с управлением заданиями, (в частности, в результатах выполнения команды ), текущее задание всегда помечается знаком +, а предыдущее - знаком -.

Для перевода задания в приоритетный режим достаточно ввести только его имя: %1 - это синоним для команды "fg %1", переводящей задание 1 из фонового в приоритетный режим. Аналогично, команда "%1 &" продолжает работу задания 1 в фоновом режиме и эквивалентна команде "bg %1".

Об изменении состояния задания командный интерпретатор узнает сразу. Обычно bash информирует об изменениях в состоянии заданий при выдаче очередного приглашения, чтобы не прерывать этой информацией выдачу любых других результатов. Если с помощью встроенной команды установлена опция , bash информирует о таких изменениях немедленно.

Если при наличии остановленных заданий происходит попытка выхода из bash, командный интерпретатор выдает соответствующее предупреждение. Затем с помощью команды можно проверить состояние этих заданий. Если сразу же выполняется повторная попытка завершить работу, командный интерпретатор не выдает предупреждения и остановленные задания прекращаются.


Управляющие конструкции readline


Библиотека readline реализует средства, аналогичные по духу возможностям условной компиляции препроцессора языка C и позволяющие назначать горячие клавиши или присваивать значения переменным в зависимости от условий. Поддерживается четыре директивы анализатора.

$if

Конструкция $if позволяет назначать те или иные клавиши в зависимости от используемого режима редактирования, тип терминала или приложения, использующего библиотеку readline. Текст условия продолжается до конца строки - никакие завершающие символы не нужны.

mode

Форма mode= директивы $if используется для проверки того, работает ли библиотека readline в режиме emacs или vi. Ее можно использовать совместно с командой set keymap, например, для установки горячих клавиш стандарта emacs и раскладки emacs-ctlx только если readline запускается в режиме emacs.

term

Форма term= может использоваться для включения специфических горячих клавиш для данного терминала, в частности, для привязки последовательностей символов к функциональным клавишам терминала. Слово справа от символа = сравнивается с полным именем терминала и частью имени терминала до первого вхождения -. Это позволяет задавать, например, sun для сопоставления как с sun, так и с sun-cmd.

приложение

Конструкция приложение используется для включения специфических настроек приложения. Каждая программа, использующая библиотеку readline, устанавливает имя приложения, а в инициализационном файле можно проверять установку определенного значения. Это можно использовать для привязки клавиш к функциям, существенным для конкретной программы. Например, следующая команда задает последовательность клавиш, берущую в кавычки текущее или предыдущее слово в bash:

$if Bash

# Взять в кавычки текущее или предыдущее слово

"\C-xq": "\eb\"\ef\""

$endif

$endif

Эта команда, как видно по предыдущему примеру, завершает команду $if.

$else

Команды в этой ветке директивы $if выполняются, если не выполнено условие проверки.

$include

Эта директива принимает в качестве аргумента имя файла и читает команды и привязки клавиш из этого файла. Например, следующая директива требует прочитать файл /etc/inputrc:

$include /etc/inputrc



УСЛОВНЫЕ ВЫРАЖЕНИЯ


Условные выражения используются составной командой [[ и встроенными командами и [ для проверки атрибутов файла и выполнения строковых и арифметических сравнений. Выражения формируются из следующих унарных и бинарных элементарных условий. Если любой из аргументов файл в одном из условий имеет вид /dev/fd/n, проверяется файл с дескриптором n.

-a файл

Истинно, если файл существует.

-b файл

Истинно, если файл существует и являтся специальным блочным устройством.

-c файл

Истинно, если файл существует и является специальным символьным устройством.

-d файл

Истинно, если файл существует и является каталогом.

-e файл

Истинно, если файл существует

-f файл

Истинно, если файл существует и является обычным файлом.

-g файл

Истинно, если файл существует и имеет установленный бит SGID.

-h файл

Истинно, если файл существует и является символической связью.

-k файл

Истинно, если файл существует и имеет установленный "клейкий" бит.

-p файл

Истинно, если файл существует и является именованным каналом (FIFO).

-r файл

Истинно, если файл существует и доступен для чтения.

-s файл

Истинно, если файл существует и имеет ненулевой размер.

-t fd

Истинно, если дескриптор файла fd открыт и связан с терминалом.

-u файл

Истинно, если файл существует и имеет установленный бит SUID.

-w файл

Истинно, если файл существует и доступен для записи.

-x файл

Истинно, если файл существует и является выполняемым.

-O файл

Истинно, если файл существует и принадлежит пользователю, задаваемому текущим эффективным идентификатором пользователя.

-G файл

Истинно, если файл существует и принадлежит группе, задаваемой текущим эффективным идентификатором группы.

-L файл

Истинно, если файл существует и является символической связью.

-S файл

Истинно, если файл существует и является сокетом.

-N файл

Истинно, если файл существует и был изменен с момента последнего чтения.

файл1 -nt файл2

Истинно, если файл1 новее (в соответствии с датой изменения), чем файл2.

файл1 -ot файл2


Истинно, если файл1 старее, чем файл2.

файл1 -ef файл2

Истинно, если файл1 и файл2 находятся на одном устройстве и имеют одинаковые номера индексных дескрипторов.

-o опция

Истинно, если установлена указанная опция командного интерпретатора. Список опций см. далее в описании опции встроенной команды .

-z строка

Истинно, если длина строки - ноль (т.е. строка - пустая).

-n строка

строка

Истинно, если длина строки - не ноль.

строка1 == строка2

Истинно, если строки совпадают. Вместо == можно использовать просто =.

строка1 != строка2

Истинно, если строки не совпадают.

строка1 < строка2

Истинно, если строка1 в текущей локали при лексикографическом упорядочении предшествует строке2.

строка1 > строка2

Истинно, если строка1 в текущей локали при лексикографическом упорядочении идет после строки2.

arg1 OP arg2

Оператор OP - один из следующих: -eq, -ne, -lt, -le, -gt или -ge. Эти бинарные арифметические операторы возвращают истину, если arg1 равен, не равен, меньше, меньше или равен,больше, больше или равен arg2, соответственно. Аргументы arg1 и arg2 могут быть любыми целыми числами.


ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ


Командный интерпретатор в определенных случаях обеспечивает вычисление арифметических выражений (см. встроенную команду и подраздел "" ранее). Вычисление выполняется в длинных целых числах без проверки переполнения, хотя деление на 0 перехватывается и выдается соответствующее сообщение об ошибке. Операторы в следующем списке сгруппированы по уровням с одинаковым приоритетом. Уровни перечислены в порядке убывания приоритета.

- +

унарные минус и плюс

! ~

логическое и побитовое отрицание

**

возведение в степень

* / %

умножение, деление, получение остатка от деления

+ -

сложение, вычитание

<< >>

побитовый сдвиг влево и вправо

<= >= < >

сравнение

== !=

равенство и неравенство

&

побитовое И

^

побитовое исключающее ИЛИ

|

побитовое ИЛИ

&&

логическое И

логическое ИЛИ

выражение?выражение:выражение

условное вычисление

= *= /= %= += -=

присваивание

В качестве операндов можно использовать переменные командного интерпретатора; перед вычислением выполняется подстановка значений параметров. Значение параметра в арифметическом выражении приводится к длинному целому. Чтобы переменную командного интерпретатора можно было использовать в арифметических выражениях, ее атрибут integer устанавливать не обязательно.

Константы с начальным 0 интерпретируются как восьмеричные числа. Начальные 0x или 0X обозначают шестнадцатеричную константу. В остальных случаях числа имеют вид [основание#]n, где основание - десятичное число от 2 до 64, представляющее основание системы счисления, а n - число в этой системе счисления. Если основание не указано, используется основание 10. Цифры, большие 9, представляются строчными буквами, прописными буквами, символами _ и @, именно в таком порядке. Если основание меньше или равно 36, прописные и строчные буквы эквивалентны и используются для представления чисел от 10 до 35.

Операторы вычисляются в порядке приоритетов. Сначала вычисляются подвыражения в круглых скобках, которые позволяют переопределить представленные выше стандартные приоритеты операторов.



ВЫПОЛНЕНИЕ КОМАНДЫ


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

Если имя команды не содержит сиволов косой черты, командный интерпретатор пытается ее найти. Если существует функция командного интерпретатора с таким именем, она вызывается как было описано выше в разделе "". Если же функции с таким именем нет, командный интерпретатор ищет ее в списке встроенных команд. Если такая встроенная команда есть, она выполняется.

Если имя не является именем функции или именем встроенной команды и не содержит пробелы, командный интерпретатор bash просматривает каждый каталог в значении переменной PATH в поисках выполняемого файла с соответствующим именем. Для запоминания полных имен выполняемых файлов bash использует хэш-таблицу (см. описание команды в разделе "" далее). Полный поиск по каталогам в PATH

выполняется только если команда не найдена в этой хэш-таблице. Если команда при таком поиске не найдена, командный интерпретатор выдает соответствующее сообщение и завершает выполнение команды со статусом выхода 127.

Если команда найдена или имя команды содержит косые черты, командный интерпретатор выполняет соответствующую команду в отдельной среде выполнения. Аргумент 0 устанавливается равным имени команды, и ей передаются параметры, соответствующие аргументам в командной строке, если они заданы.

Если выполнить команду не удалось, потому что файл не соответствует поддерживаемым выполняемым форматам, и этот файл не является каталогом, предполагается, что файл является сценарием командного интерпретатора, содержащим его команды. Для его выполнения запускается порожденный командный интерпретатор. Этот порожденный командный интерпретатор переинициализируется, как если бы для обработки сценария был вызван новый командный интерпретатор, но только местонахождения команд, запомненные родительским интерпретатором (см. описание команды ниже в разделе ""), передаются порожденному.

Если текст в файле начинается с #!, остаток первой строки задает интерпретатор для программы. Командный интерпретатор запускает указанный интерпретатор в операционных системах, которые не поддерживают соответствующий формат выполняемого файла непосредственно. Этому интерпретатору в качестве аргументов передается один необязательный аргумент, затем имя интерпретатора из первой строки программы, затем имя самой программы и ее аргументы, если они заданы.



Завершение


complete (TAB)

Пытается завершить текст, введенный до текущей позиции. Командный интерпретатор bash пытается выполнить завершение, рассматривая текст последовательно как обращение к переменной (если текст начинается с $), как имя пользователя (если текст начинается с ~), как имя хоста (если текст начинается с @), или как команду (включая псевдонимы и функции). Если ни одним из этих способов завершить строку не удалось, выполняется попытка завершения имени файла.

possible-completions (M-?)

Список возможных завершений текста до текущей позиции.

insert-completions (M-*)

Вставляет все завершения введенного текста, генерируемые командой possible-completions.

menu-complete

Аналогична команде complete, но заменяет завершаемое слово первым из возможных завершений. Повторное выполнение команды menu-complete вставляет следующий элемент из списка возможных завершений. В конце списка завершений выдается сигнал и восстанавливается исходный текст. Аргумент n вызывает преход на n позиций вперед в списке завершений; отрицательный аргумент вызывает переход по списку в обратном направлении. Предполагается привязка этой команды к клавише TAB, но стандартно она ни к какой комбинации клавиш не привязана.

delete-char-or-list

Удаляет символ в позиции курсора, если курсор не находится в начале или в конце строки (аналогично команде delete-char). Если курсор - в конце строки, ведет себя аналогично команде possible-completions. Эта команда стандартно ни к какой комбинации клавиш не привязана.

complete-filename (M-/)

Пытается завершить введенный текст до текущей позиции как имя файла.

possible-filename-completions (C-x /)

Выдает возможные завершения текста до текущей позиции, интерпретируемого как имя файла.

complete-username (M-~)

Пытается завершить введенный текст до текущей позиции как имя пользователя.

possible-username-completions (C-x ~)

Выдает возможные завершения текста до текущей позиции, интерпретируемого как имя пользователя.

complete-variable (M-$)

Пытается завершить введенный текст до текущей позиции как обращение к переменной командного интерпретатора.


possible-variable-completions (C-x $)

Выдает возможные завершения текста до текущей позиции, интерпретируемого как обращение к переменной командного интерпретатора.

complete-hostname (M-@)

Пытается завершить введенный текст до текущей позиции как имя хоста.

possible-hostname-completions (C-x @)

Выдает возможные завершения текста до текущей позиции, интерпретируемого как имя хоста.

complete-command (M-!)

Пытается завершить введенный текст до текущей позиции как имя команды. При завершении команд текст сопоставляется последовательно с псевдонимами, зарезервированными словами, функциями командного интерпретатора, встроенными функциями командного интерпретатора и, наконец, с именами выполняемых файлов.

possible-command-completions (C-x !)

Выдает возможные завершения текста до текущей позиции, интерпретируемого как имя команды.

dynamic-complete-history (M-TAB)

Пытается завершить введенный текст до текущей позиции, сравнивая его со строками из списка истории выполненных команд в поисках возможных соответствий.

complete-into-braces (M-{)

Выполняет завершение имени файла и возвращает список возможных завершений в фигурных скобках, чтобы он мог быть обработан командным интерпретатором (см. раздел "Подстановка значений в фигурных скобках" ранее).