Почему bash отключает автодополнение для некоторых команд и как его включить?

Вы можете установить и запустить mysql через:

 apt-get install mysql-server 
 service mysql start

Или используя MySQL APT Repository

wget https://repo.mysql.com//mysql-apt-config_0.8.1-1_all.deb
dpkg -i mysql-apt-config_0.8.1-1_all.deb
apt-get update
apt-get install mysql-server 
service mysql start

7
14.07.2019, 20:34
4 ответа

Завершение листинга

Вы можете увидеть, что Bash / Readline использует для завершения команды, используя complete -p command , например, если Я запускаю complete -p openvpn , я получаю

bash: complete: openvpn: no completion specification

. Это показывает, что Readline, используемый моей оболочкой, не имеет какого-либо конкретного завершения для команды openvpn , поэтому по умолчанию используется традиционная форма завершения, то есть имена файлов.

Другой пример (для демонстрации определенного завершения):

$ complete -p dillo
complete -F _filedir_xspec dillo

Это означает, что функция с именем _filedir_xspec используется для обеспечения завершения для команды dillo .

Удаление завершений

Чтобы удалить определенное завершение, используйте параметр -r со встроенной функцией complete :

complete -r openvpn
7
27.01.2020, 20:15

Bash имеет программируемое завершение. С 1999 года он способен адаптировать завершение аргументов команды к команде, а не только завершать имена файлов. Имена файлов используются по умолчанию, если не настроено завершение для конкретной команды (вот почему вы получаете имена файлов при изменении команды на openvpnx).

Программируемое завершение обычно активируется загрузкой /etc/bash_completion. Если вам не нужно программируемое завершение вообще, и вы всегда хотите завершать имена файлов даже в контекстах, где имена файлов не имеют смысла, удалите это из .bashrc.

Похоже, что у вас есть пользовательское завершение для аргументов команды openvpn, и этот код завершения ничего не предлагает для первого аргумента. Я не знаю, почему так происходит, возможно, это ошибка в коде завершения. Полезный код завершения завершал бы опции и их аргументы. Выполните complete -p openvpn, чтобы увидеть, какой код вызывается для завершения аргументов для openvpn. Вы можете отключить этот пользовательский код завершения с помощью complete -r openvpn, но тогда вы вернетесь только к именам файлов, что полезно в командной строке openvpn только после нескольких опций.

Независимо от настроек завершения, вы всегда можете завершить имя файла, вызвав complete-filename (привязка по умолчанию: M-/) вместо complete (TAB).

6
27.01.2020, 20:15

Первая проблема заключается в том, что имя двоичного файла openvpnсовпадает с записью в каталоге init.d.

complete | grep -i openvpn

дает

complete -F _service /etc/init.d/openvpn

В Ubuntu и ее производных это происходит из кода в/usr/share/bash-completion/bash_completion(части bash-completionпакета ).

for svcdir in ${sysvdirs[@]}; do
    for svc in $svcdir/!($_backup_glob); do
        [[ -x $svc ]] && complete -F _service $svc
    done
done

Закомментируйте этот блок. Перезапустите ваш экземпляр bash. Попробуйте выполнить автозаполнение openvpnс помощью TAB и выполните

complete | grep -i openvpn

Это производит

complete -F _openvpn /etc/init.d/openvpn

Вторая проблема исходит из /usr/share/bash-completion/completions/openvpn. Он пытается автоматически заполнять файлы.conf из /etc/openvpn и является препятствием, если вы попытаетесь запустить openvpn с каким-либо специальным файлом конфигурации -hoc, лежащим за пределами /etc/openvpn.

Просто удалите его и перезапустите экземпляр bash.

sudo rm /usr/share/bash-completion/completions/openvpn

Теперь вы должны получить стандартное завершение файла для команды openvpn с помощью клавиши TAB.

Если вы запустите

complete -p | grep openvpn

после того, как вы попытались выполнить автозаполнение после openvpn, теперь вы должны получить

complete -F _minimal openvpn`

Лучшим подходом было бы исправление/расширение -сценариев завершения bash для openvpn. Но это история для другого дня.


Если позже вы захотите вернуться к первоначальному состоянию пакета bash-completion, просто переустановите его с помощью следующей команды.

apt-get install --reinstall bash-completion
3
27.01.2020, 20:15

Печальная часть моего ответа заключается в том, что :bash (через readline )имеет так много возможностей для завершения. Но обычный дистрибутив Linux может нарушить базовое расширение имени файла с помощью [tab] (или [tab][tab] ), добавив расширение опции . В моем случае это пакет "bash -завершение" , который дает мне поведение, описанное в оригинальном Q.

Это не только openvpnпроблема. Q говорит :«например».

С помощью bind -p | grep completeя получаю:

"\C-i": complete
"\e\e": complete
"\e!": complete-command
"\e/": complete-filename
...
"\e\C-i": dynamic-complete-history
"\eg": glob-complete-word
"\e*": insert-completions
# menu-complete (not bound)
...
"\C-x/": possible-filename-completions

Здесь TAB = ctrl -i привязан к базовой completeфункции. Другие привязки на моем archlinux я только что опробовал.С помощью «ta[esc][star]» я могу получить все команды, начинающиеся с «ta», вставленные в мою командную строку.

Функция completereadline объясняется в man bash:

Completing

complete (TAB)

Attempt to perform completion on the text before point. Bash attempts completion treating the text as a variable (if the text begins with $), username (if the text begins with ~), hostname (if the text begins with @), or command (including aliases and functions) in turn. If none of these produces a match, filename completion is attempted.

Я могу воспроизвести это лишь частично. Я думаю, что man bash забывает упомянуть, что это зависит от того, [tab] первое слово или второе, третье и т. д. слово.

В моем домашнем/рабочем каталоге есть файлы, начинающиеся с "ba". Когда я набираю «ba[tab]» в приглашении, я не получаю эти имена, только команды от badblocksдо bashbug. Это нормальное поведение :первое слово дает вам команды, следующие за словами имена файлов. И если вы наберете «$[tab]», вы действительно получите хороший список имен переменных.

На самом деле, когда я говорю [таб], я имею в виду [таб][таб]. Но мы так привыкаем к этому, что даже не замечаем, что делает эта «полная» функция readline. С "полным -" вариантов вы можете контролировать, что ищется для (команды, имени файла, переменной )и что делать со списком, если существует более одного совпадения (возможность ).

Эти функции readline поставляются со многими привязками по умолчанию. И man bash, и man readlineперечисляют функции и их привязки по умолчанию. Для проверки используйте bind -p, как указано выше. Это также является основой для файла ~/.inputrc. Я только что сделал один (там был только загадочный /etc/inputrc):

set colored-completion-prefix on
set colored-stats on

С цветными -статами я получаю цветной список, как и с ls --color. После «bi[tab][tab]» я вижу «bind» в белом и «bison» в зеленом, что говорит мне, что «bind» — это не исполняемый файл (, а встроенный -в... это КОМАНДА расширение..."bind" - это даже не имя файла! ).

set show-all-if-ambiguous on

Этот параметр управляет вкладкой или двойной вкладкой. После того, как я добавлю его и наберу

cd s[tab]

Я напрямую получаю цветной список всех имен ФАЙЛОВ. Каталоги, ссылки, обычные файлы и т. д. отображаются своим цветом.

Эти переменные строки чтения можно увидеть с помощью bind -v.Чтобы проверить изменение.inputrc, запустите новый bash с помощью «bash», а затем выйдите. Или Re -авторизоваться.

Следующий слой находится в/usr/share/bash-completion

Он содержит скрипты для каждой команды, в основном из пакетов util -linux и systemd. Есть файл mount (2 Кб )и файл systemctl (13 Кб ). Файл монтирования -интересен :, он дает вам /proc/filesystems после того, как вы наберете «-t».

Обычно после "mount -t [tab]" я получаю FILENAMES. После того, как я получаю этот «монтированный» файл, я действительно получаю типы fs, такие как ext2, ext3 и ext4. я иду:

complete -r mount

, чтобы удалить эту функцию. (ЭТО complete— встроенная команда оболочки)

Третий уровень — это дополнительный пакет "bash -завершения" . Я уже удалил его после того, как установил для тестирования. С этим пакетом я получил эту приятную функцию расширения опций, а также имен пакетов. Я мог бы набрать «tar --[tab]» и увидеть все варианты. Но расширение имени файла затерялось во многих созвездиях. Амд не только на арчлинукс.

Этот пакет завершения bash -дал мне 2000 -строк сценария "bash _завершение" и множество командных файлов. Тот, что для "tar", состоял из 700 строк, полных функций. Так что исправить это - не решение.

Если вас действительно волнуют эти полные тонкости [tab], вы должны начать снизу и выбрать одну или две функции readline, отличные от complete, для привязки к другим клавишам, кроме [tab]. Моя конфигурация по умолчанию выше действительно работает, но я никогда не использовал ничего, кроме [tab]. Теперь я хочу установить правильные функции для правильных клавиш. С этой опцией или без нее -расширение пакета дополнения bash -.

2
27.01.2020, 20:15

Теги

Похожие вопросы