Вопрос или проблема
У меня есть контейнер, в котором оболочка запускает bash. В нем установлен bash completion, и он работает хорошо. Этот контейнер имеет много пользовательских CLI-команд, но их все нужно предварять nextcloud
. Так что, если я напишу nex <tab>
, nex достаточно уникален, чтобы завершиться.
Есть ли способ установить “умолчание” для завершения, когда я нахожусь на новой строке CLI (пустой), чтобы первый tab вставлял это значение по умолчанию, или мне было бы достаточно просто ввести nextcloud
без tab?
Я искал “bash completion” и страницу man bash, а также справку по complete. Я немного поиграл с -D, -E, и по смыслу это кажется возможным, но я не вижу, как это сделать. Небольшая помощь?
https://opensource.com/article/18/3/creating-bash-completion-script
https://linux.die.net/man/1/bash (ищите по странице Completing
)
complete: complete [-abcdefgjksuv] [-pr] [-DEI] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
Укажите, как аргументы должны завершаться с помощью Readline.
Для каждого NAME укажите, как должны завершаться аргументы. Если опции не указаны,
существующие спецификации завершения выводятся таким образом, что их можно
повторно использовать в качестве ввода.
Опции:
-p вывод существующих спецификаций завершения в повторно используемом формате
-r удалить спецификацию завершения для каждого NAME, или, если не указаны
NAME, удалить все спецификации завершения
-D применить завершения и действия как умолчание для команд
без каких-либо определенных завершений
-E применить завершения и действия к "пустым" командам --
завершение, попытка на пустой строке
-I применить завершения и действия к начальному (обычно к
команде) слову
Когда осуществляется завершение, действия применяются в порядке, в котором
перечислены выше опции с заглавными буквами. Если указано несколько опций,
опция -D имеет приоритет над -E, а обе имеют приоритет над -I.
Статус выхода:
Возвращает успех, если не указана недопустимая опция или не произошла ошибка.
-W wordlist
– это то, что вам нужно.
complete -E -W nextcloud
Вы также можете найти этот подход полезным: Bash “виртуальный” префикс терминала.
Ответ или решение
Вопрос о том, можно ли установить «умолчательное» слово для первого таба на новой строке терминала в среде bash с поддержкой завершения команд, является достаточно актуальным, особенно для пользователей, которые регулярно работают с кастомными CLI-командами. Ниже представлен полный ответ на этот вопрос с пошаговым объяснением и практическими рекомендациями.
Установка умолчательного слова для завершения команд в Bash
Контекст задачи
Вы работаете в контейнере с установленным Bash, в котором поддержка завершения команд активирована. У вас есть несколько пользовательских команд, которые требуют префикса nextcloud
. Ваша цель – автоматизировать процесс ввода этой команды, чтобы она автоматически вставлялась при нажатии клавиши Tab
, или даже просто при открытии новой строки терминала.
Использование опций complete
Bash предоставляет несколько опций для настройки поведения завершения команд. В вашем случае наиболее актуальными являются опции -E
, -D
и -I
:
-E
: Применяет завершения и действия к «пустым» командам (когда строка пустая).-D
: Применяет завершения и действия как умолчательные для команд, для которых не определено конкретное завершение.-I
: Применяет завершения и действия к начальному (обычно командному) слову.
Для вашей задачи вы можете использовать комбинацию этих опций, а именно -E
для применения завершения к пустым командам.
Пример команды
Чтобы установить nextcloud
как умолчательное слово при завершении, можно использовать следующую команду:
complete -E -W 'nextcloud'
Эта команда установит nextcloud
как предложение при попытке завершения команды, когда строка терминала будет пустой.
Добавление в конфигурационный файл
Чтобы это поведение сохранялось при каждом запуске терминала, добавьте указанную команду в файл инициализации Bash, например, в файл ~/.bashrc
:
echo "complete -E -W 'nextcloud'" >> ~/.bashrc
После добавления команды в файл вам нужно будет перезагрузить Bash или выполнить команду source ~/.bashrc
, чтобы изменения вступили в силу.
Заключение
Теперь при открытии нового терминала, если вы просто нажмете Tab
, Баш автоматически вставит nextcloud
. Это значительно упростит работу с вашими кастомными командами и уменьшит количество ошибок при вводе.
Если у вас есть дополнительные вопросы или нужны дальнейшие разъяснения, не стесняйтесь обращаться за помощью. Важно помнить, что правильная настройка процессов завершения команд может значительно повысить производительность вашей работы в Bash.