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

113

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

CamelBlues
источник
2
Возможно, вы захотите проверить /etc/bash_completion(по крайней мере, именно в этом Debian).
Wrikken 06
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

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

  • Библиотека 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.

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

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

Fixje
источник