zsh apt-get 自动完成功能无法与假 root 配合使用

zsh apt-get 自动完成功能无法与假 root 配合使用

我们在工作中使用假根环境。基本上,它是一堆模拟的目录apt-getdpkg如果设置了一些环境变量。即您运行apt-get install xxx并且包xxx被安装到这个环境中,但不是安装到系统中。

当我使用 bash 时,apt-get 自动完成功能运行良好。当我输入 时apt-get install <Tab><Tab>,如果我处于假根目录中,它会显示本地软件包列表,否则会显示全局列表。

然而,当我切换到 zsh 时,奇怪的事情发生了。目前只有全局包显示在列表中,尽管情况并非总是如此。以下是完整的故事。

  1. 我安装了 Ubuntu 并设置了虚假 root 和 zsh。
  2. 我从头重新安装了 Ubuntu,并将/home其保存在单独的分区上。
  3. 现在 zsh 自动完成总是无论我是否设置了环境变量,都向我显示来自假根的包。
  4. 我重新安装了 zsh 和 zsh-common。现在完成总是就像没有假 root 一样工作。同时我意识到重新安装后文件夹Ubuntu从中消失了/usr/share/zsh/functions/Completion,现在 apt-get 完成规则从文件夹中获取Debian

您能否向我解释一下这里可能发生的情况以及如何使用系统和伪 apt-get 设置 zsh 完成工作?

我使用 Ubuntu 16.04.2。

fakerootPS 我的假root与命令无关。

答案1

好吧,我终于搞明白了。Zsh 补全引擎会缓存一些东西,包括 apt 返回的可用软​​件包列表。现在我的故事似乎很清楚了:当自动补全总是向我推荐来自假 root 的软件包时,这是因为我第一次在假 root 环境中运行 zsh,相应的软件包列表进入了缓存。

如果您想覆盖它(假设您使用 oh-my-zsh),只需在调用 oh-my-zsh 之前将以下代码添加到您的 .zshrc 中:

if [[ check for fakeroot ]]; then
  export ZSH_CACHE_DIR=desired-cache-dir-name
fi

这将假根和基础系统之间的完成缓存分开,并从后期解决问题。

相关内容