Debian 上服务命令的制表符补全

Debian 上服务命令的制表符补全

我有两个系统都安装了 debian squeeze。在一个系统上输入:

service <TAB> 

它显示了所有可用的服务(来自 /etc/init.d)

在另一个系统上,它会显示当前目录中的所有文件。有人知道哪种设置会改变这种行为吗?

更新:

缺少文件 /etc/bash_completion.d/service。我从它正在运行的机器上复制了它。如果我输入,complete -p | grep service它会显示:

complete -F _service service

在无法运行该命令的机器上,该命令没有显示任何内容。我complete -F _service service在命令行中执行后,该命令service <TAB>显示:

service -su: completion: function `_service' not found

该函数在我最近复制的服务文件中定义,由于某些原因无法找到它...

答案1

首先检查 bash-completion 是否已安装,运行:

 $ dpkg -l bash-completion | tail -1

它应该输出类似这样的内容:

ii  bash-completion  1:1.3-1  programmable completion for the bash shell

如果输出为空则使用以下命令安装:

aptitude install bash-completion

然后检查它是否已启用:

 $ grep -A 2 bash_completion ~/.bashrc /etc/bash.bashrc

应该输出类似

~/.bashrc:if [ -f /etc/bash_completion ]; then
~/.bashrc:    . /etc/bash_completion
~/.bashrc:fi

如果没有类似内容或被注释(#之后有~/.bashrc:),则添加/取消注释

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

到 ~/.bashrc 并使用以下方式重新读取它

. ~/.bashrc

此后它就应该正常工作了。

答案2

我遇到了同样的问题,但“tab”只显示了众多服务中的两个。查看 /usr/share/bash-completion/bash_completion,你可以看到:

_sysvdirs()
{
    sysvdirs=( )
    [[ -d /etc/rc.d/init.d ]] && sysvdirs+=( /etc/rc.d/init.d )
    [[ -d /etc/init.d ]] && sysvdirs+=( /etc/init.d )
    # Slackware uses /etc/rc.d
    [[ -f /etc/slackware-version ]] && sysvdirs=( /etc/rc.d )
}

在我的例子中,/etc/rc.d/init.d 存在并且只有两个服务。删除该目录后,一切正常。

相关内容