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