我正在将我的开发环境从 Macos 复制到 Ubuntu 上。其中很大一部分工作是将一些实用的 zsh 脚本从一台机器移植到另一台机器上。
一个反复出现的障碍是如何开始compgen
工作。我研究过类似Bash 补全在 ZSH/Oh-My-ZSH 中不起作用的帖子,因为 COMP_WORDS 不是数组
底线:到目前为止,在 Linux zsh 上,我陷入“未找到 compgen 命令”的困境。
我确实曾经在 bash 补全下locate
找到compgen
某个地方,但从 zsh 调用它不起作用。是的,compgen
从 bash 调用它有效。
回到我的 Mac,在哪里compgen
工作,我在which compgen
zsh 下闲着没事地做了一个,它返回的看起来像是一个函数定义而不是路径。
which compgen
:
(仅复制前 10 行以提供您一个大概印象)
compgen () {
local opts prefix suffix job OPTARG OPTIND ret=1
local -a name res results jids
local -A shortopts
emulate -L sh
setopt kshglob noshglob braceexpand nokshautoload
shortopts=(a alias b builtin c command d directory e export f file g group j job k keyword u user v variable)
while getopts "o:A:G:C:F:P:S:W:X:abcdefgjkuv" name
do
case $name in
....
同时,在bash下,which compgen
不返回任何内容,大概是因为它是内置的。
那么compgen
under zsh来自哪里?它是通过我的~/.zshrc中的完成初始化计算出来的吗?很有可能bashcompinit
?:
(注意:以下内容取自 macos ~/.zshrc,compgen 在此工作)
# The following lines were added by compinstall
zstyle :compinstall filename '/Users/me/.zshrc'
autoload -Uz compinit
compinit
# End of lines added by compinstallx
autoload -Uz bashcompinit
bashcompinit
#stop completions from $PATH on source, as per https://stackoverflow.com/a/72710684
unset '_comps[source]'