Por que o terminal auto complete às vezes não sugere nada para o comando `services`?

17

Às vezes, quando eu digito um comando no terminal, o preenchimento automático do terminal não funciona, mesmo que meu comando não esteja errado.

Por exemplo, olhe para isto: sudo service vsftpd statussudo e serviço não tem nenhum problema. Quero dizer, quando você digita sud + tabterminal, sugere que você sudo ou eu digite servi + tabterminal, conclua esse serviço . Mas para o vsftpd não recebo nenhuma sugestão. Existe uma maneira de dizer "terminal, por favor me diga alguma sugestão !!?".

Mohammad Reza Rezwani
fonte

Respostas:

28

O grau em que o preenchimento automático funciona é uma função de quão bem os scripts de shell no bash-completionpacote funcionam.

No Ubuntu 14.04, o script que lida com conclusões serviceestá em /usr/share/bash-completion/bash_completion. Ele procura nomes de serviço como arquivos em /etc/rc.d/init.de /etc/init.d, e na saída de systemctl list-units --full --all.

Mas instalar o vsftpdpacote não coloca nenhum arquivo /etc/init.d, porque ele foi systemd-ificado; coloca um arquivo de configuração /etc/systemd/system/vsftpd.service. systemctl list-unitsencontraria esse arquivo se não fosse o fato de o Ubuntu, atualmente, não incluir um systemctlcomando.

Portanto, no momento, você não receberá auto-conclusões para service vsftpd, mas obterá para a maioria dos outros serviços, pois os arquivos de configuração estão /etc/init.d.

Mark Plotnick
fonte
Para quem encontra esta resposta: A conclusão de encontrar serviços (e tempo para localizar / analisar) sempre foi um problema em 14.xx, 16.xx 18.xx: Bom exemplo: sudo systemctl (status ou parada) lightd(TAB / Double TAB) ( Significado completo 'lightdm.service', supondo que você o tenha instalado - ativo / em execução ou não) Este svc está na saída de unidades e /etc/init.dna minha máquina. Encontrei o mesmo problema em outros serviços também. Há também um erro (?) Que leva muito tempo para concluir. Visto sentar 10+ segundos antes de apitar para mim / não encontrado. github.com/systemd/systemd/issues/7185
bshea
9

Quando houver várias sugestões possíveis, tabnão produzirá nenhuma sugestão. Usar tab tab(guia dupla) produzirá uma lista de todas as sugestões possíveis.

Dan
fonte
Eu usei: tab + tab não funciona para vsftpd. Você e a sugestão de Rinzwind são trabalho, por exemplo, su + tab + tab. Mas para vsftpd não funciona.
Mohammad Reza Rezwani
você pode testar se instalar primeiro pequeno vsftpd programa sudo apt-get install vsftpd e tente guia + tab
Mohammad Reza Rezwani
2
tab + tab não funciona no caso de parâmetros. Em sudo service vsftpd status, o vsftpd é um parâmetro de serviço e, portanto, não será encontrado com uma guia dupla. O OP está correto neste momento.
27414 Jos
2
@ Jos Mas outros serviços como apache2e networkingpreenchimento automático. Como eles são diferentes?
Dan
@ dan08 Estou corrigido. Além disso, sudo service networking tab tabvai oferecer force-reload reload restart start stop. Então, funciona ainda melhor do que eu pensava.
Jos
6

O vsftpd provavelmente tem mais de uma opção. tabduas vezes para ver as possibilidades.

Exemplo: licom tabtabshows:

libnetcfg          line               lintian-info       lispmtopgm
libreoffice        linguist           linux32            listres
lightdm            link               linux64            
lightdm-session    lintian            linux-boot-prober  
Rinzwind
fonte
4

Você pode construir o seu próprio!

Por exemplo: coloque complete -f -r -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)'no bash do que se tiver sue pressione tab / tab para todos os usuários, sim. Veja aqui

elf12
fonte
0

Descobri que systemctl list-units --full --allnão lista serviços desativados; portanto, o preenchimento automático não

# check if enabled
systemctl is-enabled <service_name>
# enable
systemctl enable <service_name>
Lluís
fonte
0

O comando services depende de "systemctl list-units --full --all" e não lista os serviços que não podem ser iniciados (ou desativados como acima), para confirmar se você está enfrentando esse problema.

systemctl status <service_name>
faíscas
fonte