In the system there is a nodejs
, installed through nvm
. The command is not running npm
.
Console is Oh my zsh
9 Answers
You can use zsh-nvm or enable it yourself by adding following lines to your ~/.zshrc
export NVM_DIR=~/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
Extra:
For faster shell initialization, I use lazynvm
which only loads node when needed
lazynvm() {
unset -f nvm node npm
export NVM_DIR=~/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
}
nvm() {
lazynvm
nvm $@
}
node() {
lazynvm
node $@
}
npm() {
lazynvm
npm $@
}
Reference: Lazy load nvm for faster shell start

- 5,963
- 2
- 36
- 47
-
1If anyone is using Vim for development, the lazy loading causes autocompletion using tsserver to fail because tsserver won't be found in PATH. Best to just use eager loading IMHO. – geoyws Oct 27 '19 at 03:48
-
If I add this to ~/.zshrc, I get "command not found" when running nvm? How do I use this? – Petrus Theron Oct 21 '20 at 10:53
-
make sure your .zshrc has been loaded: you can type "lazy" and press Tab to see if the ZSH auto-completion shows you lazynvm. if not, check your shell config or ZSH config to make sure it's loading the `.zshrc` – Ryan Wu Oct 23 '20 at 14:04
-
If using oh-my-zsh, the nvm plugin already has lazy loading implemented, so skip to the next answer. – javs Feb 17 '22 at 16:38
-
For anyone wondering `[ -s "$NVM_DIR/nvm.sh" ]` => `-s FILE - True if the FILE exists and has nonzero size` – Kellen Stuart Nov 08 '22 at 18:19
Switching from Bash to Oh-My-Zsh
If you already have nvm
installed and you're switching from bash
to oh-my-zsh
you can simply open up your .zshrc
file and add the nvm
plugin that is included with oh-my-zsh
:
- Open your zsh config file
.zshrc
in nano with this command:nano ~/.zshrc
- Scroll down to where it shows
plugins=(git)
and addnvm
inside the parentheses to make it show asplugins=(git nvm)
(separate plugins with spaces) - Press
control
+O
(on macOS), thenenter
, to save, then presscontrol
+X
to exit - Then open a new terminal window/tab and enter
nvm ls
to confirm it works. Note that you must open a new window/tab for your shell to use the newly updated.zshrc
config (or entersource ~/.zshrc
, etc.)
Source: https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/nvm

- 1,915
- 1
- 10
- 11
-
1Thanks for the detailled answer. I think the only way to improve this answer is: Adding a Header (Moved from Bash to zsh) and add some linebreaks – duichwer Aug 29 '19 at 14:10
-
1
-
1
-
-
we ran into this issue because we had oh-my-zsh on top of basic zsh. Thanks for the answer. – Khwaja Sanjari Jun 20 '23 at 17:35
This worked for me on Ubuntu 20.04.
Install or update nvm
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
Run the following commands in your terminal to add to your ~/.zshrc
echo 'export NVM_DIR=~/.nvm' >> ~/.zshrc
echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' >> ~/.zshrc
Load in the current shell environment
source ~/.zshrc
Check the nvm version
nvm -v
use homebrew to install nvm
brew install nvm
edit your system configuration
vim ~/.zshrc # or vim ~/.bashrc
export NVM_DIR=~/.nvm
esc > :wq
save file
reload the configuration
source $(brew --prefix nvm)/nvm.sh
view nvm version
$ nvm --version
# 0.36.0
enjoy it.

- 3,927
- 33
- 31
-
3`source $(brew --prefix nvm)/nvm.sh` was the missing piece for me. Thanks! – Aurelio Dec 02 '20 at 13:43
-
Thanks, this solved my issue. Glad I tried this before doing any reinstallation. – yoges nsamy Jun 19 '21 at 00:46
-
A much easier solution is to use the nvm plugin that is shipped by default:
It also automatically sources nvm, so you don't need to do it manually in your .zshrc
git clone https://github.com/nvm-sh/nvm.git ~/.nvm
cd ~/.nvm && git checkout v0.35.1
(current latest release)- Add
nvm
to your~/.zshrc
. Ex:plugins=(... nvm)

- 50,086
- 26
- 101
- 112
I discovered that there is a nvm plug-in shipping with oh-my-zsh (that's different from lukechilds plugin). After short inspection, I think it adds the necessary modifications to .zshrc
when loading, so simply adding nvm
to the plugins list in .zshrc
should work as well (and it does for me).
I did not find any more details on that default nvm plugin via google so I don't know whether this is the "go-to" solution.

- 2,066
- 2
- 22
- 45
-
1As of this writing, adding `nvm` as a plugin did not work for me on a Mac (OS should not be a factor, though). I still get `zsh: command not found: nvm`. I'll try adding manually. – Mike S. Jun 20 '20 at 12:54
-
I'm having the same issue. May I know what you mean by `adding manually`? – yoges nsamy Jun 19 '21 at 00:30
-
To get [zsh-nvm](https://github.com/lukechilds/zsh-nvm) working, I had to find the section in the README [how to install plugin](https://github.com/lukechilds/zsh-nvm#as-an-oh-my-zsh-custom-plugin). Steps involved: `git clone https://github.com/lukechilds/zsh-nvm ~/.oh-my-zsh/custom/plugins/zsh-nvm` and I had to edit the `~/.zshrc` file and to add the plugin `plugins=( git zsh-nvm )`. Loaded new terminal and `nvm list` finally worked. – Dave Boster Nov 18 '22 at 22:29
With Linux (Ubuntu 20.04, 22.04, 22.10 and 23.04)
With your favorite editor, you edit ~/.zshrc
nano or vi ~/.zshrc
At the end of the file, you add :
# NVM
export NVM_DIR=~/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
And then you run :
source ~/.zshrc

- 1,967
- 2
- 19
- 27
Add this code to .zshrc on your user directory
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion
Then run this code on your terminal:
source ~/.zshrc

- 163
- 1
- 3
I strongly suggest using christophemarois' approach to lazy loading nvm (node, npm and global packages) in order to avoid slow shell starting times:
# Add every binary that requires nvm, npm or node to run to an array of node globals
NODE_GLOBALS=(`find ~/.nvm/versions/node -maxdepth 3 -type l -wholename '*/bin/*' | xargs -n1 basename | sort | uniq`)
NODE_GLOBALS+=("node")
NODE_GLOBALS+=("nvm")
# Lazy-loading nvm + npm on node globals call
load_nvm () {
export NVM_DIR=~/.nvm
[ -s "$(brew --prefix nvm)/nvm.sh" ] && . "$(brew --prefix nvm)/nvm.sh"
}
# Making node global trigger the lazy loading
for cmd in "${NODE_GLOBALS[@]}"; do
eval "${cmd}(){ unset -f ${NODE_GLOBALS}; load_nvm; ${cmd} \$@ }"
done

- 117
- 2
- 10