有时候,apt-get install
自动完成功能会损坏。按下 时,查看可供安装的软件包名称对我来说非常有用Tab。
例如,如果我按下Tab之后的键sudo apt-get install ruby
,则会显示所有以 开头的包ruby
,例如ruby-mysql
、ryby-dev
等。
与此相反,如果我按下Tab,我会得到一个目录列表,就像我使用cd
并按下时得到的一样Tab。
如何修复这个自动完成功能?
答案1
正如对其他答案的评论所述,首先确保已bash-completion
安装:
sudo apt-get install bash-completion
和显然是为了@diapir,它有助于重新安装它:
sudo apt-get install --reinstall bash-completion
但是,对我来说,问题不是 bash-completion 没有安装或损坏,而是我不小心删除了我的.bashrc
文件。你可以从以下位置复制一个新文件/etc/skel
:
cp /etc/skel/.bashrc ~/
答案2
键入以下命令:
sudo -H gedit /etc/bash.bashrc
寻找以下几行:
# enable bash completion in interactive shells
# if ! shopt -oq posix; then
# if [ -f /usr/share/bash-completion/bash_completion ]; then
# . /usr/share/bash-completion/bash_completion
# elif [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
# fi
# fi
取消注释一些行,使其看起来像这样:
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
保存,关闭终端,然后重新打开它。
我在安装 13.04 后遇到了这个问题,这就是我解决它的方法。
答案3
请注意此命令的输出:
apt-config dump | grep "Dir::Cache"
应该是这样的:
Dir::Cache "var/cache/apt";
Dir::Cache::archives "archives/";
Dir::Cache::srcpkgcache "srcpkgcache.bin";
Dir::Cache::pkgcache "pkgcache.bin";
如果值为Dir::Cache::pkgcache
空,apt 将无法自动完成软件包名称。请查看您的/etc/apt/apt.conf.d/
文件并搜索此键以确保它未设置为空字符串。
grep -r pkgcache /etc/apt/apt.conf.d/
要修复它,请注释掉所有行/etc/apt/apt.conf.d/docker-clean
# DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
# APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
# Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";
进而
apt update
另请查看这个答案。
答案4
bash-completion
从下载最新的稳定版本http://bash-completion.alioth.debian.org/
,并在下载的目录中使用以下命令来构建和安装它:
./configure
make
sudo make install
如果你还没有make
安装,你可以使用以下包进行安装build-essential
:
sudo apt install build-essential
安装成功后,将以下行插入到您的~/.bashrc
文件中:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi