我是怎么解决的

我是怎么解决的

我使用的是 Debian Jessie 8.6。我注意到,apt-get当按包和命令的选项卡时,会得到预期的 bash 自动完成,但当尝试将其与它一起使用时,它apt不起作用。我记得使用的是 xubuntu 16.04,它可以工作,所以我觉得很奇怪,它在这里不起作用。有没有办法apt也为命令启用它?如果是这样,怎么办?

答案1

Debian 没有安装和启用“bash-completion”。

如果您是从 Ubuntu 背景进入 Debian 的,那么它是预安装并默认启用的,这可能会造成一些混乱。

要启用/“修复”此问题,请运行(以 root 身份):

apt-get install bash-completion

然后,你有两个选择。您可以:

 1. 为自己的每个用户启用它,或者

 2. 全局启用。

1. 如果您只想为您的用户启用它,请编辑~/.bashrc- 添加以下内容:

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

要在不注销并重新登录的情况下尝试它,请运行:

    . ~/.bashrc

或者打开一个新的外壳。然后尝试使用 apt 来完成制表符补全。开头的点和空格 ( .) 与 bash 中使用关键字相同source,但更可移植。

su如果您希望它在进入 root 帐户时工作,请在 root 的主目录中执行相同的操作(通常/root)。

2.要全局启用它,请从 (1) 在文件中/etc/bash.bashrc代替。

对于任何想知道为什么会起作用的人来说,.前面的/etc/bash_completion确实不是引用当前目录,因为它周围有空格。相反,它使给定文件的内容在当前运行的 shell 中计算,而不是在新的子 shell 中执行。这里已经标准化了。

在 Bash 中,这.可以用 command 代替source,但这不是 POSIX 标准化的,而且可移植性较差,所以我倾向于引导人们不要使用它。在这种情况下,由于它是专门用于扩展 bash 的程序,而不是需要在 bourne shell 或 中工作的程序ksh,因此您可以随意替换source可读性。

顺便说一句,这种行为(不打开子 shell)类似于 DOS/Windows .BAT 脚本正常工作的方式,改变它们运行的​​ shell 的状态。这就是为什么如果您cd在 shell 脚本中进入不同的路径,当脚本退出时,您不会像在 .BAT 中那样位于该路径中。

答案2

在 Debian 9 Stretch 中,只需编辑 /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

答案3

我是怎么解决的

wget我在尝试自动完成时遇到了自动完成问题,我设法通过从下面的苍蝇中apt-get install wg[TAB][TAB]删除参数来解决它:--no-generate

/usr/share/bash-completion/completions/apt-cache
/usr/share/bash-completion/completions/apt-get

值得一提的是,这些文件只有在安装后才可用bash-completion

我所指的参数--no-generate可以在下面的行中看到,但我 --no-generate不仅从这一行中删除了 ALL : https://github.com/scop/bash-completion/blob/master/completions/apt-get#L28

我是怎么走到这一步的?

set -v我在运行previous to后到达了这一点apt-get install wg[TAB][TAB],这表明执行的命令是:

apt-cache --no-generate pkgnames wg

输出是一个错误:

E: Could not open file  - open (2: No such file or directory)

当我在apt-cache pkgnames wg没有执行的情况下执行时--no-generate,我正确地获得了自动完成列表:

root@484f5c8f56ba:/# apt-cache pkgnames wg
wgalician-minimos
wget2
wgaelic
wget
wgerman-medical
wget2-dev

希望这可以帮助。

答案4

将此配置文件从 Ubuntu:/usr/share/bash-completion/completions/apt 复制到 Jessie 中的同一目录。您还可以在此处获取该文件:http://pastebin.com/PRBMt3an

相关内容