为什么zsh无法执行compdef命令?

20

我在Ubuntu 18.04上安装了zsh和oh my zsh。我想为kubectl使用自动补全。因此,我已经将source <(kubectl completion zsh)添加到我的~/.zshrc文件中。

执行此脚本时,zsh会收到以下错误:

complete:13: command not found: compdef

kubectl文档指出,当出现上述错误时,您应该将以下内容放在.zshrc文件的顶部:

autoload -Uz compinit
compinit

在执行此操作并重新启动终端后,我仍然遇到了同样的错误。

在一个git问题中,我发现以下方法帮助了一些人解决了常见的问题:

#This will perform chmod g-w for each file returned by compaudit to remove write access for group
compaudit | xargs -I % chmod g-w "%"
#This will perform chown to current user (Windows and Linux) for each file returned by compaudit
compaudit | xargs -I % chown $USER "%"
#Remove all dump files (which normally speed up initialization)
rm ~/.zcompdump*
#Regenerate completions file
compinit

运行脚本时,zsh记录了以下内容:

kubescript:12457: command not found: _bash_comp

不幸的是,这并没有解决我的问题。我还能做些什么来修复我的问题吗?或者甚至更好的问题是:我能做些什么来找出问题的根源?


尝试这个 https://unix.stackexchange.com/questions/339954/zsh-command-not-found-compinstall-compinit-compdef 一些用户还建议,如果您安装了两个不同版本的zsh,则可能会出现此错误。 - mario
很不幸,建议的链接没有帮助。而且我非常确定我只安装了一个版本的zsh。 - Robert van der Spek
你尝试过两个答案中的解决方案了吗? - mario
是的,我做了。两个都没有结果。 - Robert van der Spek
1
看起来像是这个问题 https://github.com/kubernetes/kubectl/issues/125 - mario
就是这样。目前似乎没有解决方案... - Robert van der Spek
9个回答

41

我通过在.zshrc中使用以下代码来修复错误:

# K8s auto-complete
autoload -U +X compinit && compinit
source <(kubectl completion zsh)

如果您使用oh-my-zsh,您也可以使用oh-my-zsh插件来完成此操作。


7

我遇到了同样的问题,通过升级 nvm 解决了它

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash


这里没有任何区别。 - Robert van der Spek
3
在这里,“nvm”是什么关系? - Timo

7
安装Angular CLI后,我遇到了这个问题。原来Angular会将一些内容添加到你的.zshrc文件中。
如果你最近安装了Angular CLI,请打开~/.zshrc并删除Angular CLI添加的行。

~/.zshrc文件中有这一行代码source <(ng completion script),它只有左尖括号没有右尖括号。昨天由于这个脚本,我的终端运行命令被阻塞了几个小时。但是我注释掉了这一行,现在我的命令行终端正常工作了。谢谢! - Thomas David Kehoe

7

对于我使用的OSX 10.15.7,我做了类似的操作

vi ~/.zshrc

alias k=kubectl
autoload -U +X compinit && compinit
[[ /usr/local/bin/kubectl ]] && source <(kubectl completion zsh)

简直就像魔法一样好用!


3

在尝试了许多选项并查看了许多线程后,我在运行以下命令后解决了问题。

autoload -Uz compinstall && compinstall

这将配置 ~/.zshrc,并通过添加以下2行来初始化 compinit:

autoload -Uz compinit
compinit

然后运行下面sudo命令,这些命令在链接中有提到。

$ sudo chmod -R 755 /usr/local/share/zsh
$ sudo chown -R root:staff /usr/local/share/zsh
$ compaudit | xargs chmod g-w

最后重新启动终端。

希望对某些人有所帮助。


我运行了你建议的 autoload -Uz compinstall && compinstall 命令(按照最少提示操作,直到我的 .zshrc 文件包含你提到的两行代码),然后重新启动了终端(我没有尝试运行 sudo 命令),问题得到了解决。有趣的是,在重新启动终端后,我尝试注释掉 .zshrc 文件中的 autoload -Uz compinitcompinit 行,但一切仍然按预期工作(即使在终端重启后也是如此)...因此,最初的 autoload -Uz compinstall && compinstall 命令修复了我的问题,而不需要更改 ~/.zshrc 文件。 - skplunkerin

0

在安装 Angular CLI(Angular 版本 14.x)并接受 cli 命令自动补全的添加后,会遇到此问题。以下是 .zshrc 文件的片段:

# Load Angular CLI autocompletion.
source <(ng completion script)

将源代码行注释掉解决了我的问题(macOS 12.6(21G115))。

# Load Angular CLI autocompletion.
# source <(ng completion script)

仍需找出根本原因。


1
Norbu Sonam的答案的副本--显示.zshrc文件中受影响的行。 - Amitabh
这里让人感到非常受欢迎。 - Amitabh

0

对我来说,我有这行代码:

source ~/.oh-my-zsh/plugins/git/git.plugin.zsh

在我的~/.zshrc文件中,我尝试在plugins=(git)加载插件之前引用它。
删除那行代码后问题得到解决。
如果你已经添加了插件并且一切正常,但仍然遇到问题,可能是因为你尝试在加载插件之前使用它。就像我的情况一样。

0

0

我真的尝试了这里的每一个答案,但都没有起作用。

所以,我尝试了这个教程,并注意到最后一条建议:

"注意:确保在任何对compdef的调用之前添加此片段,否则您仍将看到错误"

我在我的~/.zshrc和~/.bash_profile文件中有一个完整的Terraform安装调用。

https://thysmichels.com/2020/07/16/mac-solved-command-not-found-compdef/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接