我们在工作中使用假根环境。基本上,它是一堆模拟的目录apt-get
,dpkg
如果设置了一些环境变量。即您运行apt-get install xxx
并且包xxx
被安装到这个环境中,但不是安装到系统中。
当我使用 bash 时,apt-get 自动完成功能运行良好。当我输入 时apt-get install <Tab><Tab>
,如果我处于假根目录中,它会显示本地软件包列表,否则会显示全局列表。
然而,当我切换到 zsh 时,奇怪的事情发生了。目前只有全局包显示在列表中,尽管情况并非总是如此。以下是完整的故事。
- 我安装了 Ubuntu 并设置了虚假 root 和 zsh。
- 我从头重新安装了 Ubuntu,并将
/home
其保存在单独的分区上。 - 现在 zsh 自动完成总是无论我是否设置了环境变量,都向我显示来自假根的包。
- 我重新安装了 zsh 和 zsh-common。现在完成总是就像没有假 root 一样工作。同时我意识到重新安装后文件夹
Ubuntu
从中消失了/usr/share/zsh/functions/Completion
,现在 apt-get 完成规则从文件夹中获取Debian
。
您能否向我解释一下这里可能发生的情况以及如何使用系统和伪 apt-get 设置 zsh 完成工作?
我使用 Ubuntu 16.04.2。
fakeroot
PS 我的假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
这将假根和基础系统之间的完成缓存分开,并从后期解决问题。