Dlaczego automatyczne uzupełnianie terminala czasami nie sugeruje niczego dla polecenia `services`?

17

Czasami, gdy wpisuję polecenie na terminalu, autouzupełnianie terminala nie działa, nawet jeśli moje polecenie nie jest złe.

Na przykład spójrz na to: sudo service vsftpd statussudo i serwis nie mają żadnych problemów. To znaczy, po wpisaniu sud + tabzacisk proponujemy sudo albo wpisuję servi + tabCOMPLETE terminal, który na służbie . Ale dla vsftpd nie otrzymuję żadnych sugestii. Czy istnieje sposób na powiedzenie „terminalu, powiedz mi jakąkolwiek sugestię !!?”.

Mohammad Reza Rezwani
źródło

Odpowiedzi:

28

Stopień, w jakim działa automatyczne uzupełnianie, jest funkcją tego, jak dobrze działają skrypty powłoki w bash-completionpakiecie.

W Ubuntu 14.04, skrypt, który obsługuje do uzupełnienia servicejest w /usr/share/bash-completion/bash_completion. Wyszukuje nazwy usług jako pliki w /etc/rc.d/init.di /etc/init.dna wyjściu systemctl list-units --full --all.

Ale zainstalowanie vsftpdpakietu nie powoduje wstawienia żadnych plików /etc/init.d, ponieważ zostało to systemdpotwierdzone; wstawia plik konfiguracyjny/etc/systemd/system/vsftpd.service . systemctl list-unitsznalazłby ten plik, gdyby nie fakt, że Ubuntu w chwili obecnej nie zawiera systemctlpolecenia.

Tak więc w tej chwili nie będziesz otrzymywać autouzupełniania dla service vsftpd, ale będzie dla większości innych usług, ponieważ ich pliki konfiguracyjne są w /etc/init.d.

Mark Plotnick
źródło
Dla tych, którzy znajdą tę odpowiedź: Usługi wyszukiwania ukończenia (i czas na znalezienie / parsowanie) zawsze stanowiły problem poniżej 14.xx, 16.xx 18.xx: Dobry przykład: sudo systemctl (status lub stop) lightd(TAB / Double TAB) ( Oznacza to kompletne „lightdm.service”, zakładając, że masz zainstalowane - aktywne / uruchomione lub nie) Ten svc jest zarówno w jednostkach wyjściowych, jak i /etc/init.dna mojej maszynie. Znalazłem ten sam problem również w innych serwisach. Istnieje również błąd (?), Który powoduje, że ukończenie zajmuje dużo czasu. Widziałem, jak siedział ponad 10 sekund, zanim zaczął piszczyć do mnie / nie znaleziono. github.com/systemd/systemd/issues/7185
bshea
9

Gdy istnieje wiele możliwych sugestii, tabnie spowoduje to żadnych sugestii. Użycie tab tab(podwójna karta) spowoduje wyświetlenie listy wszystkich możliwych sugestii.

Dan
źródło
Użyłem: tab + tab nie działa dla vsftpd. Sugestia ty i Rinzwinda to praca, na przykład su + tab + tab. Ale dla vsftpd nie działa.
Mohammad Reza Rezwani
możesz przetestować ten pierwszy program instalacyjny vsftpd przez sudo apt-get install vsftpd, a następnie wypróbuj tab + tab
Mohammad Reza Rezwani
2
tab + tab nie działa w przypadku parametrów. W sudo service vsftpd statusvsftpd jest parametrem usługi, dlatego nie można go znaleźć z podwójną kartą. W tym momencie OP jest poprawny.
Jos
2
@Jo Ale inne usługi, takie jak apache2i networkingautouzupełnianie. Czym się różnią?
Dan
@ dan08 Stoję poprawiony. Ponadto sudo service networking tab tabzaoferuje force-reload reload restart start stop. Działa to nawet lepiej niż myślałem.
Jos
6

vsftpd ma prawdopodobnie więcej niż 1 opcję. tabdwa razy, aby zobaczyć możliwości.

Przykład: liz tabtabpokazami:

libnetcfg          line               lintian-info       lispmtopgm
libreoffice        linguist           linux32            listres
lightdm            link               linux64            
lightdm-session    lintian            linux-boot-prober  
Rinzwind
źródło
4

Możesz zbudować własny!

Np .: włóż się complete -f -r -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)'w bash niż jeśli masz sui naciśnij tab / tab, to daje wszystkim użytkownikom, tak. Zobacz tutaj

elf12
źródło
0

Znalazłem, że systemctl list-units --full --allnie ma listy wyłączonych usług, więc autouzupełnianie nie

# check if enabled
systemctl is-enabled <service_name>
# enable
systemctl enable <service_name>
Lluís
źródło
0

Polecenie services opiera się na „systemctl list-units --full --all” i nie wyświetla usług, które nie mogą zostać uruchomione (lub wyłączone jak wyżej), aby potwierdzić, czy występuje ten problem, możesz uruchomić

systemctl status <service_name>
iskry
źródło