Spec-Zone.ru › Bash

Программируемая завершение

При попытке завершения слова аргумента команды, для которой определена спецификация завершения (a compspec) с помощью встроенного complete (см. Встроенные функции программируемого завершения), вызываются средства программируемого завершения.

Сначала определяется имя команды. Если для этой команды определена спецификация завершения, используется спецификация завершения для генерации списка возможных завершений для слова. Если слово команды является пустой строкой (завершение выполняется в начале пустой строки), используется любая спецификация завершения, определенная с опцией -E к complete. Если слово команды является полным путем к файлу, сначала ищется спецификация завершения для полного пути. Если для полного пути не найдена спецификация завершения, предпринимается попытка найти спецификацию завершения для части после последнего слеша. Если эти поиски не приводят к спецификации завершения, используется любая спецификация завершения, определенная с опцией -D к complete, в качестве значения по умолчанию. Если нет спецификации завершения по умолчанию, Bash пытается расширить алиас слова команды в качестве последнего средства и пытается найти спецификацию завершения для слова команды из любого успешно расширенного результата.

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

Сначала используются действия, указанные в спецификации завершения. Возвращаются только совпадения, которые начинаются со слова, которое завершается. Когда используется опция -f или -d для завершения имени файла или имени каталога, используется переменная оболочки FIGNORE, чтобы отфильтровать совпадения. См. Переменные Bash для описания FIGNORE.

Далее генерируются все завершения, указанные в шаблоне расширения имени файла опции -G. Слова, сгенерированные шаблоном, не обязательно должны совпадать со словом, которое завершается. Переменная оболочки GLOBIGNORE не используется для фильтрации совпадений, но используется переменная оболочки FIGNORE.

Затем рассматривается строка, указанная в качестве аргумента к опции -W. Строка сначала разбивается с помощью символов в специальной переменной IFS, как разделители. В строке учитываются цитаты оболочки, чтобы обеспечить механизм для слов, которые могут содержать символы метаязыка оболочки или символы в значении IFS. Затем каждое слово расширяется с помощью расширения фигурных скобок, тильды, параметра и переменной, подстановки команд и арифметического расширения, как описано выше (см. Расширения оболочки). Результаты разбиваются с помощью правил, описанных выше (см. Разделение слов). Результаты расширения сопоставляются с префиксом слова, которое завершается, и соответствующие слова становятся возможными завершениями.

После того, как эти совпадения были сгенерированы, вызывается любая функция или команда оболочки, указанная с опциями -F и -C. При вызове команды или функции переменным COMP_LINE, COMP_POINT, COMP_KEY, и COMP_TYPE присваиваются значения, как описано выше (см. Переменные Bash). Если вызывается функция оболочки, также устанавливаются переменные COMP_WORDS и COMP_CWORD. При вызове функции или команды первым аргументом ($1) является имя команды, аргументы которой завершаются, вторым аргументом ($2) является слово, которое завершается, а третьим аргументом ($3) является слово, предшествующее слову, которое завершается, в текущей строке команды. Фильтрация сгенерированных завершений по отношению к завершаемому слову не выполняется; функция или команда имеют полную свободу в генерации совпадений.

Сначала вызывается любая функция, указанная с опцией -F. Функция может использовать любые средства оболочки, включая встроенные функции compgen и compopt, описанные ниже (см. Встроенные функции программируемого завершения), чтобы сгенерировать совпадения. Она должна поместить возможные завершения в переменную массива COMPREPLY, по одному элементу массива.

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

После генерации всех возможных завершений к списку применяется любой фильтр, указанный с опцией -X. Фильтр — это шаблон, используемый для расширения имени файла; символ ‘&’ в шаблоне заменяется текстом завершаемого слова. Буквальный символ ‘&’ может быть экранирован обратной косой чертой; обратная косая черта удаляется перед попыткой сопоставления. Ведущий символ ‘!’ отрицает шаблон; в этом случае удаляются все завершения, не соответствующие шаблону. Если включена опция оболочки nocasematch (см. описание shopt в Встроенная функция Shopt), сопоставление выполняется без учета регистра буквенных символов.

Наконец, любой префикс и суффикс, указанные с помощью опций -P и -S, добавляются к каждому члену списка завершений, и результат возвращается коду завершения Readline в качестве списка возможных завершений.

Если ранее примененные действия не сгенерировали совпадения и опция -o dirnames была предоставлена встроенной команде complete при определении спецификации завершения, предпринимается попытка завершения имени каталога.

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

По умолчанию, если найдена спецификация завершения, всё, что она генерирует, возвращается коду завершения как полный набор возможных завершений. Стандартные завершения Bash не проверяются, и стандартное завершение имени файла Readline отключено. Если опция -o bashdefault была предоставлена встроенной команде complete при определении спецификации завершения, стандартные завершения Bash проверяются, если спецификация завершения не генерирует совпадения. Если опция -o default была предоставлена встроенной команде complete при определении спецификации завершения, стандартное завершение Readline будет выполнено, если спецификация завершения (и, если это было предпринято, стандартные завершения Bash) не генерируют совпадения.

Когда спецификация завершения указывает, что необходимо завершение имени каталога, функции программируемого завершения заставляют Readline добавлять слеш к завершенным именам, которые являются символическими ссылками на каталоги, в зависимости от значения переменной Readline mark-directories, независимо от настройки переменной Readline mark-symlinked-directories.

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

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

_completion_loader()
{
    . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader -o bashdefault -o default

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API