Як працює заповнення вкладки bash?


113

Я останнім часом проводив багато часу в оболонці і мені цікаво, як працює автозаповнення вкладок. Який механізм за цим? Як баш знає вміст кожного каталогу?


2
Ви можете перевірити /etc/bash_completion(принаймні, саме там багато магії в Debian).
Wrikken

1
@Wrikken: Це bash_completion, що залежить від заповнення вкладки, але не зовсім, як це відбувається.
Ігнасіо Васкес-Абрамс

4
Також є кілька запитань щодо * 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
Cascabel

Відповіді:


101

До автозавершення є дві частини:

  • Бібліотека читання ліній, як уже згадувалося fixje, керує редагуванням командного рядка та повертає назад до bash, коли натискається вкладка, щоб увімкнути завершення. Потім Bash надає (див. Наступний пункт) список можливих доповнень і readline вставляє стільки символів, скільки однозначно ідентифіковано вже введеними символами. (Ви можете досить налаштувати бібліотеку читань, див. Розділ Редагування командного рядка Bash посібник для деталей.)

  • Сам Bash має вбудований completeдля визначення механізму завершення окремих команд. Якщо для поточної команди нічого не визначено, вона використовувала завершення за назвою файлу (використовуючи opendir / readdir, як сказав Ігнасіо).

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

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

Ви можете перелічити існуючі доповнення, визначені у вашому поточному середовищі bash, використовуючи просто complete, щоб мати враження про те, що можливо. Якщо у вас встановлений пакет bash-завершення (або він названий у вашій системі), для багатьох команд встановлено доповнення, і, як сказав Вріккен, /etc/bash_completionміститься скрипт bash, який потім часто виконується при запуску оболонки для налаштування цього. Додаткові спеціальні сценарії завершення можуть бути розміщені в /etc/bash_completion.d; всі вони отримані з /etc/bash_completion.


1
Сторінки довідників існують лише для незалежних команд, а не для вбудованих оболонок. Але це частина посібника з bash, який я зв'язав.
Paŭlo Ebermann

7

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.