Почему автоматическое завершение терминала иногда не предлагает ничего для команды `services`?

17

Иногда, когда я набираю команду на терминале, автозаполнение терминала не работает, даже если моя команда не неправильная.

Например, посмотрите на это: у sudo service vsftpd statussudo и service нет никаких проблем. Я имею в виду, когда вы набираете sud + tabтерминал, предлагайте вам sudo или я набираю servi + tabтерминал, чтобы завершить это для обслуживания . Но для vsftpd я не получаю никаких предложений. Есть ли способ сказать «терминал, пожалуйста, скажите мне любое предложение !!?».

Мохаммед Реза Резвани
источник

Ответы:

28

Степень, в которой работает автозаполнение, зависит от того, насколько хорошо bash-completionработают сценарии оболочки в пакете.

В Ubuntu 14.04 скрипт для обработки завершений serviceнаходится в /usr/share/bash-completion/bash_completion. Он ищет имена сервисов как файлы в /etc/rc.d/init.dи /etc/init.d, так и в выходных данных systemctl list-units --full --all.

Но установка vsftpdпакета не помещает никаких файлов /etc/init.d, потому что он был systemd-ифицирован; он помещает файл конфигурации в /etc/systemd/system/vsftpd.service. systemctl list-unitsнашел бы этот файл, если бы не тот факт, что в настоящее время в Ubuntu нет systemctlкоманды.

Таким образом, на данный момент вы не получите автозаполнения для service vsftpd, но вы получите большинство других сервисов, так как их конфигурационные файлы находятся в /etc/init.d.

Марк Плотник
источник
Для тех, кто находит этот ответ: Услуги по поиску завершения (и времени на поиск / анализ) всегда были проблемой в 14.xx, 16.xx 18.xx: Хороший пример: sudo systemctl (статус или остановка) lightd(TAB / Double TAB) ( Это означает, что «lightdm.service» завершен, если вы установили его - активный / работающий или нет). Этот svc находится как в выходных единицах, так и /etc/init.dна моей машине. Я обнаружил такую ​​же проблему и в других сервисах. Также есть ошибка (?), Которая заставляет долго заканчиваться. Видел, что сидишь 10+ секунд, прежде чем подать на меня / не найдено. github.com/systemd/systemd/issues/7185
bshea
9

Когда есть несколько возможных предложений, tabне будет производить никаких предложений. Использование tab tab(двойная вкладка) создаст список всех возможных предложений.

Дэн
источник
Я использовал: tab + tab не работает для vsftpd. Вы и Ринзвинд советуете работать, например, su + tab + tab. Но для vsftpd не работает.
Мохаммед Реза Резвани
Вы можете проверить, что сначала установить небольшую программу vsftpd с помощью sudo apt-get install vsftpd, а затем попробовать tab + tab
Мохаммад Реза Резвани
2
tab + tab не работает в случае параметров. В sudo service vsftpd status, vsftpd является параметром службы, и поэтому не будет найден с двойной вкладкой. ОП на данном этапе верна.
Джос
2
@Jos Но другие сервисы, такие как apache2иnetworking автозаполнение. Насколько они разные?
Дан
@ dan08 Я исправлен. Более того, sudo service networking tab tabпредложат force-reload reload restart start stop. Так что это работает даже лучше, чем я думал.
Джос
6

vsftpd имеет, вероятно, более 1 варианта. tabдважды, чтобы просмотреть возможности.

Пример: liс tabtabшоу:

libnetcfg          line               lintian-info       lispmtopgm
libreoffice        linguist           linux32            listres
lightdm            link               linux64            
lightdm-session    lintian            linux-boot-prober  
Rinzwind
источник
4

Вы можете построить свой собственный!

Например: поместите complete -f -r -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)'в bash, чем, если у вас есть, suи нажмите tab / tab, это даст вам всех пользователей, да. Смотри здесь

elf12
источник
0

Я обнаружил, что systemctl list-units --full --allне перечисляет отключенные службы, поэтому автозаполнение не

# check if enabled
systemctl is-enabled <service_name>
# enable
systemctl enable <service_name>
Lluís
источник
0

Команда services использует "systemctl list-units --full --all" и не выводит список служб, которые не могут быть запущены (или отключены, как указано выше), чтобы подтвердить, что у вас возникла эта проблема, которую вы можете запустить

systemctl status <service_name>
искры
источник