В последнее время я проводил много времени в оболочке, и мне интересно, как работает автозаполнение вкладок. Какой за этим механизм? Как bash узнает содержимое каждого каталога?
В последнее время я проводил много времени в оболочке, и мне интересно, как работает автозаполнение вкладок. Какой за этим механизм? Как bash узнает содержимое каждого каталога?
Ответы:
Автозаполнение состоит из двух частей:
Библиотека readline, как уже упоминалось fixje, управляет редактированием командной строки и обращается к bash при нажатии табуляции, чтобы разрешить завершение. Затем Bash дает (см. Следующий пункт) список возможных завершений, а readline вставляет столько символов, сколько однозначно идентифицируется уже введенными символами. (Вы можете довольно сильно настроить библиотеку readline, см. Раздел Редактирование командной строки Bash руководство для деталей.)
Сам Bash имеет встроенную complete
функцию для определения механизма завершения для отдельных команд. Если для текущей команды ничего не определено, использовалось завершение по имени файла (используя opendir / readdir, как сказал Игнасио).
Часть для определения ваших собственных завершений описана в разделе « Программируемое завершение» . Короче говоря,
complete «options» «command»
вы определяете завершение для некоторой команды. Например, complete -u su
говорит, что
при заполнении аргумента для su
команды поиск пользователей текущей системы .
Если это сложнее, чем могут покрыть обычные параметры (например, различные завершения в зависимости от индекса аргумента или в зависимости от предыдущих аргументов), вы можете использовать -F function
, который затем вызовет функцию оболочки для создания списка возможных завершений. (Это используется, например, для завершения git, что очень сложно, в зависимости от подкоманды, а иногда и от заданных параметров, а иногда и с использованием имен веток (о которых bash ничего не знает).
Вы можете перечислить существующие дополнения, определенные в вашей текущей среде bash, просто complete
, чтобы получить представление о том, что возможно. Если у вас установлен пакет bash-Completion (или как он назван в вашей системе), установлены завершения для множества команд, и, как сказал Wrikken, /etc/bash_completion
содержит сценарий bash, который затем часто выполняется при запуске оболочки, чтобы настроить это. Могут быть помещены дополнительные пользовательские сценарии завершения /etc/bash_completion.d
; все они получены из /etc/bash_completion
.
Если вас интересуют основы: Bash использует строку чтения, которая включает историю и базовое завершение. Вы можете изучить источник, если хотите получить подробное представление. Кроме того, вы можете использовать readline для создания собственных интерфейсов CLI с завершением
/etc/bash_completion
(по крайней мере, именно в этом Debian).