#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 с завершением