我有两个系统都安装了 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 存在并且只有两个服务。删除该目录后,一切正常。