终端自动补全功能无法正常工作

如果我开始输入一个命令,比如apt-g,按下tab键后,Shell会将该命令自动补全为apt-get,但是对于命令的第二部分,比如install,如果我输入一些字符,比如insta,再按下tab键,它不会自动补全为install

另一个例子:当我输入sudo后,按下tab键没有任何自动补全。例如:sudo apt-ge[tab]什么都没有。

我使用迷你镜像(40MB网络安装程序)安装了Ubuntu,所以可能有一些我忽略的配置!

我已经将这段代码添加到我的.bashrc文件中,但它仍然无效:

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

我也检查了.bashrc的权限,它是-rw-r--r--。
我在更改后使用source .bashrc来应用新环境的变化,但还是没有效果。
我使用xfce4-terminal,所以我认为问题可能出在终端而不是bash上。
但是编辑:
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml

改变中:
<property name="&lt;Super&gt;Tab" type="string" value="switch_window_key"/>

至:

<property name="&lt;Super&gt;Tab" type="string" value="empty"/>

也没有任何区别。

4个回答

bash-completion 是一组bash脚本,它能够为特定的命令启用自定义的自动补全功能。

这不仅适用于文件和目录,还适用于命令。所以您可以输入命令的部分内容,然后按下 Tab 键,我们就会得到该命令的自动补全。

安装

步骤1:安装bash-completion

$ sudo apt-get install bash-completion

有时候,如果我们按照以下命令重新安装它,就可以解决问题:
$ sudo apt-get install --reinstall bash-completion
步骤2:在你的.bashrc文件中启用bash自动补全功能。
打开gedit ~/.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

重要提示:在更改文件后,您需要使用source ~/.bashrc命令重新加载您的~/.bashrc文件,或者重新打开终端。现在应该已经修复了。

2我想确认将上述代码块添加到~/.bashrc文件中确实对我起作用。只有一个评论;你实际上不需要注销并重新登录来使其生效(你可能不想终止正在进行的工作),你可以直接运行source ~/.bashrc - nullgeppetto
1我不得不重新打开终端才能使其正常工作! - Gilberto Albino
4完成突然对我失效了,上述步骤无法解决问题。有什么办法可以排除故障吗?在Ubuntu 16.04上。 - Gudlaugur Egilsson
2第二步就可以了。或者从/etc/skel/.bashrc获取模板。 - Hendy Irawan
不适用于su连字符(至少对于Arch Linux)(例如su - username)。 - Sergio Ivanuzzo
1@SergioIvanuzzo,不确定你遇到了什么问题,你可以看一下这个链接:https://unix.stackexchange.com/q/219342/72456,它可能会有所帮助。如果没有解决你的问题,你可以提出自己的问题。 - αғsнιη
对我来说,只有chmod不能自动补全,你有什么想法为什么会这样? - Daniel
不确定是哪一部分起作用了,因为我尝试了全部三个,但这个方法有效。我的问题是Bash只能自动补全第二个参数,而不能补全第一个参数,例如cd install/<TAB>不会显示install文件夹内的子文件夹,但time cd install/<TAB>可以正常工作。 - CodeMonkey
最终解决了我的问题的是通过这个答案 https://serverfault.com/a/99791/185200 改变用户的shell。 - JVE999

如果你的情况是在Xfce下无法工作的终端选项卡,解决方案如下:
1. 打开“应用程序菜单” > “设置” > “窗口管理器”。 2. 点击“键盘”选项卡。 3. 清除“为相同应用程序切换窗口”的设置。

Window Manager screenshot how to clear switch window for same application

我已经找到了解决方法[这里](link1)。

尝试了接受的答案,但一切都已经就位。对我来说,这确实是解决方案。 - user1226868
2截至2018年5月,这仍然是我需要的解决方案。 - clifgray
1一旦我通过xrdp连接上了,这个就会派上用场了。 - bitsoflogic

你可能也在一个不支持自动补全的shell中(例如:Bourne Shell | SH)。如果你想要BASH的自动补全功能,你需要切换到BASH(Bourne Again SHell)并使用以下命令。
chsh -s /bin/bash

来源:Ubuntu Wiki - 更改Shell

或者只需点击“bash”即可运行。 - undefined

在我的情况下,我试图执行一个脚本./myScript.sh,但是输入./my[tab]时无法自动补全。
我不得不给文件添加执行权限,这样自动补全才能正常工作。