Warum schlägt die automatische Vervollständigung des Terminals manchmal nichts für den Befehl "services" vor?

17

Wenn ich einen Befehl auf dem Terminal eingebe, funktioniert die automatische Vervollständigung des Terminals manchmal nicht, auch wenn mein Befehl nicht falsch ist.

Schauen Sie sich zum Beispiel Folgendes an: sudo service vsftpd statussudo und service haben keine Probleme. Ich meine, wenn Sie sud + tabterminal eingeben, schlagen Sie sudo vor, oder wenn Sie servi + tabterminal eingeben, vervollständigen Sie das zu service . Aber für vsftpd bekomme ich keinen Vorschlag. Gibt es eine Möglichkeit zu sagen: "Terminal, bitte sag mir einen Vorschlag !!?".

Mohammad Reza Rezwani
quelle

Antworten:

28

Inwieweit die automatische Vervollständigung funktioniert, hängt davon ab, wie gut die Shell-Skripte im bash-completionPaket funktionieren.

In Ubuntu 14.04 befindet sich das Skript, das Vervollständigungen verarbeitet, servicein /usr/share/bash-completion/bash_completion. Es sucht nach Dienstnamen als Dateien in /etc/rc.d/init.dund /etc/init.dund in der Ausgabe von systemctl list-units --full --all.

Bei der Installation des vsftpdPakets werden jedoch keine Dateien abgelegt /etc/init.d, da es systemdgeändert wurde. Es legt eine Konfigurationsdatei an /etc/systemd/system/vsftpd.service. systemctl list-unitsIch würde diese Datei finden, wenn Ubuntu zum gegenwärtigen Zeitpunkt keinen systemctlBefehl enthält.

Im Moment erhalten Sie also keine automatischen Vervollständigungen für service vsftpd, aber für die meisten anderen Dienste, da sich deren Konfigurationsdateien in befinden /etc/init.d.

Mark Plotnick
quelle
Für diejenigen, die diese Antwort finden: Die Vervollständigungssuche (und die Zeit zum Finden / Analysieren) war immer ein Problem unter 14.xx, 16.xx 18.xx: Gutes Beispiel: sudo systemctl (Status oder Stopp) lightd(TAB / Double TAB) ( Dies bedeutet, dass Sie 'lightdm.service' abgeschlossen haben, vorausgesetzt, Sie haben es installiert - aktiv / aktiv oder nicht) /etc/init.d. Ich habe das gleiche Problem auch bei anderen Diensten festgestellt. Es gibt auch einen Fehler (?), Durch den die Fertigstellung viel Zeit in Anspruch nimmt. Gesehen sitzt es 10+ Sekunden vor dem Piepen bei mir / nicht gefunden. github.com/systemd/systemd/issues/7185
bshea
9

Wenn es mehrere mögliche Vorschläge gibt, tabwird kein Vorschlag erstellt. Mit tab tab(Doppel-Tab) wird eine Liste aller möglichen Vorschläge erstellt.

Dan
quelle
Ich habe verwendet: Tab + Tab funktioniert nicht für vsftpd. Du und Rinzwinds Vorschlag ist, zum Beispiel su + tab + tab zu arbeiten. Aber für vsftpd funktioniert das nicht.
Mohammad Reza Rezwani
Sie können testen, ob Sie zuerst das kleine Programm vsftpd mit sudo apt-get install vsftpd installieren und dann tab + tab versuchen
Mohammad Reza Rezwani
2
tab + tab funktioniert bei Parametern nicht. In sudo service vsftpd statusist vsftpd ein Dienstparameter und wird daher nicht mit einem doppelten Tabulator gefunden. Das OP ist zu diesem Zeitpunkt korrekt.
Jos
2
@Jos Aber andere Dienste mögen apache2und networkingautomatisch vervollständigen . Wie unterscheiden sie sich?
Dan
@ dan08 Ich stehe korrigiert. Darüber hinaus sudo service networking tab tabwird anbieten force-reload reload restart start stop. Es funktioniert also noch besser als ich dachte.
Jos
6

vsftpd hat wahrscheinlich mehr als 1 Option. tabzweimal, um die Möglichkeiten anzuzeigen.

Beispiel: limit tabtabShows:

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

Sie können Ihre eigenen bauen!

ZB: complete -f -r -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)'in Bash setzen, als wenn Sie haben suund Tab / Tab drücken, gibt es Ihnen alle Benutzer, ja. Sehen Sie hier

elf12
quelle
0

Ich habe festgestellt, dass systemctl list-units --full --alldeaktivierte Dienste nicht aufgelistet werden, die automatische Vervollständigung also nicht

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

Der Befehl services basiert auf "systemctl list-units --full --all" und listet keine Dienste auf, die nicht gestartet (oder wie oben deaktiviert) werden können, um zu überprüfen, ob dieses Problem auftritt, das Sie ausführen können

systemctl status <service_name>
Funken
quelle