为什么终端自动完成有时不建议`services'命令使用任何内容?


17

有时,当我在终端上键入命令时,即使我的命令没有错,终端的自动完成也不起作用。

例如,看一下:sudo service vsftpd statussudo和service没问题。我的意思是,当你键入SUD + tab终端建议你执行sudo或I型Servi大街 + tab终端的完整,为服务。但是对于vsftpd我没有任何建议。有没有办法说“终端,请告诉我任何建议!?”。

Answers:


28

自动完成的工作程度取决于bash-completion程序包中的Shell脚本的工作情况。

在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.servicesystemctl 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位于我的计算机上。我在其他服务上也发现了同样的问题。还有一个bug(?),使完成过程花费很长时间。看到它坐了10秒钟以上才对我发出哔哔声/找不到。github.com/systemd/systemd/issues/7185
bshea '18

9

当有多个可能的建议时,tab将不会产生任何建议。使用tab tab(双标签)将产生所有可能建议的列表。


我用过:tab + tab不适用于vsftpd。您和Rinzwind的建议是可行的,例如su + tab + tab。但是对于vsftpd不起作用。
Mohammad Reza Rezwani 2014年

您可以先通过sudo apt-get install vsftpd安装小程序vsftpd进行测试,然后尝试使用Tab + Tab
Mohammad Reza Rezwani 2014年

2
tab + tab在使用参数的情况下不起作用。在中sudo service vsftpd status,vsftpd是服务的参数,因此无法使用双标签找到。此时OP是正确的。
2014年

2
@Jos但是其他服务例如apache2networking自动完成。它们有何不同?
2014年

@ dan08我已纠正。而且,sudo service networking tab tab将提供force-reload reload restart start stop。因此它的工作效果比我想像的还要好。
2014年

6

vsftpd可能有多个选项。tab两次查看可能性。

例如:litabtab显示:

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

4

您可以建立自己的!

例如:将complete -f -r -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)'bash 放入您的bash中su,然后按tab / tab,它会为您提供所有用户,是的。看这里


0

我发现其中systemctl list-units --full --all未列出禁用的服务,因此自动补全功能不会

# check if enabled
systemctl is-enabled <service_name>
# enable
systemctl enable <service_name>

0

services命令依赖于“ systemctl list-units –full --all”,并且不会列出无法启动(或如上禁用)的服务,以确认是否遇到此问题可以运行

systemctl status <service_name>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.