40

When I use a terminal like iTerm or Hyper, right as I boot it up, the first message I get is:

complete:13: command not found: compdef

I don't know what this is from, and how to get rid of it. This message does not show up on the default terminal app though.

I am using zsh.

1
59

This is the same issue I got on my mac OS. I am using zsh shell.

Zsh Compdef error

Compdef is basically a function used by zsh for load the auto-completions. The completion system needs to be activated. If you’re using something like oh-my-zsh then this is already taken care of, otherwise you’ll need to add the following to your ~/.zshrc

autoload -Uz compinit
compinit

Completion functions can be registered manually by using the compdef function directly like this compdef . But compinit need to be autoloaded in context before using compdef.

1
  • This worked for me. On my system, it was caused by adding the completion for the "flux" cli. Adding these lines before the "flux" commands fixed the issue. It does seem this should be the accepted answer.
    – ptsw
    Nov 16 at 22:03
19

After more research, I have found my answer. There was a block in my .zprofile:

export NVM_DIR="/Users/Aaron/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

The last line loads compdef. But when doing this it caused some sort of confliction. All I needed to do was comment out:

# [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

And the annoying error went away. And the best part: I still have zsh tab completion.

1
  • That was exactly my problem as well, thank you. Jan 14 at 10:08
7

Update: The issue is already fixed in newer versions of nvm. Update nvm using the install script and the error should go away (tested with v0.37.2)

I had the same problem, after some research I found that the root of the issue was a nvm code snippet in the .zshrc (could also be .zprofile) file.

export NVM_DIR="/Users/Aaron/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

Like suggested in another answer, commenting the third line does solve the issue, but, surprise surprise, bash completion for nvm commands will not be available anymore.

The real problem is at the end of the bash_completion script:

# complete is a bash builtin, but recent versions of ZSH come with a function
# called bashcompinit that will create a complete in ZSH. If the user is in
# ZSH, load and run bashcompinit before calling the complete function.
if [[ -n ${ZSH_VERSION-} ]]; then
  autoload -U +X bashcompinit && bashcompinit
fi

But to call bashcompinit, compinit must have been called before and at this time it isn‘t. (I think this should/could be fixed in the nvm script, I will create an issue on github.)

If you want to have nvm completion, you can just call compinit yourself before the script runs.

autoload -Uz compinit
compinit -i

export NVM_DIR="/Users/Aaron/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

The -i option tells compinit to silently ignore all insecure files and directories, which might prevent further errors in the future.

0

It depends on what you set as your default (login-)shell for the system, for Terminal, for iTerm. Updated bash installed and set to execute in one of them gives differing results.

This error comes from a so called dot-file you installed. These are files with a dot in front (hence the name) like .bashrc. That means they are invisible to the Finder and to a simple ls. The dot-files in question are read by your shell when it starts up. They contain instructions, settings, customisations; maybe little snippets of program code.

Not all dot-files in your users home directory are read by the shell. Those read by bash may include: .bash_history .bash_profile .bash_prompt .bash_sessions .bashrc .editorconfig .exports .functions .inputrc .profile (This list is not exhaustive)

Those files may have been created by you, manipulated by you or by certain programs like fink, homebrew or ports. You may have just copied those from the net to "upgrade"/personalize your shell.

Regardless of how you arrived at the current situation. Open your Terminal/iTerm from another user and the symptoms will probably not be observed.

That means: all those files are in a sense 'safe to delete': in the sense that they are not essential for running your Terminal or your shell. Make a backup of those in case they indeed contain personalised settings you may depend on in your daily work. Examples for that include additions to your $PATH variables. Without those you may find programs like fink no longer working.

However the actual error message you posted indicates two things:

  • The combined content of your dot-files did not work to accomplish what they were supposed to do. More exact: an instruction (compdef) was called and that is not available.

  • That you very probably sourced a bunch of dot-files from a source on the net like holman-dotfiles. These included a bug that had the exact same error message.

So you should look through all of the dot-files for your current user and keep only the stuff you recognise as necessary (remember the backups). Then you might use the updated files from your source again. But keep in mind that these are quite 'comprehensive'. It would be prudent to not use them all blindly and actually test and pick a subset of all those options.

Using them all blindly or indiscriminately may not only lead to issues like the one prompting this question but also when following other how-tos or troubleshooting advice.

Update: This answer was given to a previous version of the question that did not indicate zsh as the shell used. -> Substitute zsh where you read bash above.

0

I also receieved this error, but I had a different solution.

My .zshrc file had this:

# Setup Kubectl completion
if [ /usr/local/bin/kubectl ]; then source <(kubectl completion zsh); fi

# The next line enables shell command completion for gcloud.
if [ -f '/Users/my-user-name/google-cloud-sdk/completion.zsh.inc' ]; then . '/Users/my-user-name/google-cloud-sdk/completion.zsh.inc'; fi

I needed to place the kubectl completion part AFTER executing the completion.zsh.inc script:

# The next line enables shell command completion for gcloud.
if [ -f '/Users/my-user-name/google-cloud-sdk/completion.zsh.inc' ]; then . '/Users/my-user-name/google-cloud-sdk/completion.zsh.inc'; fi

# Setup Kubectl completion
if [ /usr/local/bin/kubectl ]; then source <(kubectl completion zsh); fi
1
  • These are not getting stuck if I initialize a new terminal... Is there any reason? Feb 22 at 22:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .