Why can't zsh execute command compdef?

Viewed 21130

I have installed zsh and oh my zsh on Ubuntu 18.04. I would like to use autocompletion for kubectl. Therefore I have added source <(kubectl completion zsh) to my ~/.zshrc file.

On execution of this script zsh gets the following error:

complete:13: command not found: compdef

The kubectl documentation states that when one gets the error above, you should put the following on top of the .zshrc file:

autoload -Uz compinit
compinit

After doing this and restarting the terminal, I get the same error.

In a git-issue I found the following helped people with a common issue:

#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 logs the following while running the script:

kubescript:12457: command not found: _bash_comp

Unfortunately this did not solve my problem. What else can I do to fix my issue? Or even still: what can I do to find out what is causing it?

9 Answers

I fixed the error by using the following code in .zshrc:

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

You may also do it using oh-my-zsh plugin if you use oh-my-zsh.

I had the same issue and it was solved updating nvm

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

For my OSX 10.15.7 I did something similar

vi ~/.zshrc

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

Works like a charm!

After trying lot of options and going through diff treads. It worked for me after running below command

autoload -Uz compinstall && compinstall

This configures the ~/.zshrc and initialize the compinit by adding these 2 below lines:

autoload -Uz compinit
compinit

and then run below sudo commands which mentioned in link

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

at last restart the terminal.

Hope this helps for someone.

I encountered this after installing the Angular CLI. Turns that Angular adds something into your .zshrc file.

If you recently installed Angular CLI, open ~/.zshrc and remove the lines added by Angular CLI.

I really tried every answer here, but nothing worked.

So, I tried this tutorial paying attention to the last observation:

"Note: Make sure you add this snippet before any call to compdef else you will still see the error"

I had a complete call from Terraform installation in my ~/.zshrc and ~/.bash_profile files.

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

For me I had this line:

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

In my ~/.zshrc file. Which was trying to source the plugin before it is loaded by plugins=(git)

Removing that line fixed it for me.

If you have added the plugins and everything works well, One of the reasons is you may be trying to use the plugin before it is loaded. As in my case.

This issue is (also) faced after installing Angular CLI (Angular Version 14.x) and accepting addition of autocompletion for the cli commands. Snippet from .zshrc:

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

Commenting out the source line resolved the issue for me (macOS 12.6 (21G115)).

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

Still need to work out the root cause.

Related