Как работает завершение вкладки bash?

#bash #shell #autocomplete

#bash #оболочка #автозаполнение

Вопрос:

В последнее время я провожу много времени в оболочке, и мне интересно, как работает автозаполнение вкладки. Каков механизм, стоящий за этим? Как bash узнает содержимое каждого каталога?

Комментарии:

1. Возможно, вы захотите проверить /etc/bash_completion (по крайней мере, именно в этом заключается большая часть волшебства Debian).

2. @Wrikken: Это bash_completion , которое зависит от завершения вкладки, но не совсем от того, как это происходит.

3.Есть также несколько вопросов по * nix stackexchange, в том числе: unix.stackexchange.com/questions/4738 /… unix.stackexchange.com/questions/1800/custom-autocomplete unix.stackexchange.com/questions/12356 /… и хотя бы один на SU: superuser.com/questions/289539/custom-bash-tab-completion

Ответ №1:

Автозаполнение состоит из двух частей:

  • Библиотека readline, как уже упоминалось fixje, управляет редактированием командной строки и вызывает bash при нажатии tab, чтобы включить завершение. Затем Bash выдает (см. Следующий пункт) список возможных завершений, а readline вставляет столько символов, сколько однозначно идентифицируется уже введенными символами. (Вы можете настроить библиотеку readline в довольно широких пределах, подробности см. в разделе Редактирование командной строки руководства по Bash.)

  • В сам Bash встроен complete механизм завершения для отдельных команд. Если для текущей команды ничего не определено, она использовала завершение по имени файла (используя opendir / readdir, как сказал Игнасио).

    Часть для определения ваших собственных завершений описана в разделе Программируемое завершение. Короче говоря, с complete «options» «command» вы определяете завершение для некоторой команды. Например, complete -u su говорится , что при завершении аргументации для su команды выполните поиск пользователей текущей системы.

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

Вы можете перечислить существующие завершения, определенные в вашей текущей среде bash, используя simply complete , чтобы составить представление о том, что возможно. Если у вас установлен пакет завершения bash (или как бы он ни назывался в вашей системе), устанавливаются завершения для множества команд, и, как сказал Wrikken, /etc/bash_completion содержит скрипт bash, который затем часто выполняется при запуске командной строки для настройки этого. В /etc/bash_completion.d могут быть размещены дополнительные пользовательские сценарии завершения; все они получены из /etc/bash_completion .

Комментарии:

1. Справочные страницы существуют только для независимых команд, не для встроенных в оболочку. Но это часть руководства по bash, на которое я ссылался.

Ответ №2:

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