解決 Mac 輸入指令出現 zsh: command not found: xxx 問題

前言

zsh: command not found: xxx 這個錯誤訊息我發現滿多人會遇到的,所以這一篇就來紀錄一下如何解決這個問題。

問題描述

首先我先來描述一下狀況,目前手上遇到的狀況有兩種,所以我也會針對這兩種狀況來進行說明與解決,分別是:

  • 有安裝並使用 nvm 的狀況
  • 沒有安裝 nvm,直接安裝 Node.js 的狀況

而這些都是發生在使用了 zsh 之後導致的,只要你輸入任何指令都會出現 zsh: command not found: xxx 的錯誤訊息,如…

1
2
3
zsh: command not found: hexo
zsh: command not found: vue-cli
...

所以就讓我們一個一個來解決吧!

有安裝並使用 nvm 的狀況

通常來講,我們在實戰開發上都會使用 nvm 來管理我們的 Node.js 版本,透過 nvm 可以很方便且快速的切換 Node.js 版本,並且安裝的套件也不會互相干擾,但是有時候會發生以下問題

1
2
3
zsh: command not found: hexo
zsh: command not found: vue-cli
...

只是你會發現 nvm 卻是正常的(WT…)

如果運氣好,你可能會在終端機上看到以下訊息:

1
2
nvm is not compatible with the npm config "prefix" option: currently set to "/Users/ray/.npm-global"
Run `nvm use --delete-prefix v14.15.1 --silent` to unset it.

這樣就比較好解決問題,因為這段錯誤訊息就是在跟你說,你的 npm 設定的前綴路徑跟 nvm 不相容,所以你必須要先解決這個問題,才能夠正常使用 nvm,接下來就來一個一個步驟處理吧~

步驟一:移除 npm 前綴路徑

首先我們要先移除 npm 的前綴路徑,這樣才能夠讓 nvm 正常運作,所以請輸入以下指令

1
nvm use --delete-prefix vxx.xx.xx --silent

Note
xx 代表的是你的 Node.js 版本,因此我目前假設使用 v14.15.1 就是輸入以下
nvm use --delete-prefix v14.15.1 --silent

這個指令主要用途是,先切換到你指定的 Node.js 版本,然後刪除 npm 的前綴路徑,這樣就可以讓 nvm 正常運作了。

到這邊你可以先嘗試輸入一些指令,看看是否已經正常運作了,如果還是沒有的話,那就繼續往下走~

步驟二:重新設置 npm 的前綴路徑

接下來我們要重新設置 npm 的前綴路徑,這樣才能夠讓 npm 正常運作,所以請輸入以下指令

1
npm config delete prefix

這個指令是在幫我們刪除儲存在 npm 設定檔中的前綴路徑,讓它恢復到預設路徑(也就是 .npm-global)。

移除完畢後,我們要重新設置 npm 的前綴路徑,所以請輸入以下指令

1
npm config set prefix $NVM_DIR/versions/node/vxx.xx.x

Note
vxx.xx.x 請依據你使用的 Node 版本調整,因此我的就是如下
npm config set prefix $NVM_DIR/versions/node/v14.15.1

理論上來講,到這邊你應該就解決了無法使用特定指令的問題了,也不會再出現 nvm is not compatible with the npm config "prefix" 警告哩~

沒有安裝 nvm,直接安裝 Node.js 的狀況

理論上來說,如果你輸入 npm 指令都正常,但在你安裝特定 Global 套件時出現 zsh: command not found: xxx 的錯誤訊息,那就代表你的 zsh 環境變數沒有設定好,所以你需要手動設定一下。

步驟一:確認 .zshrc 路徑

首先我們要先確認一下 zsh 的環境變數是否有設定正確,請幫我輸入以下指令找到你的 zsh 設定檔路徑

1
echo $ZDOTDIR/.zshrc

如果 $ZDOTDIR 是空的,那你應該會看到 ~/.zshrc 這個路徑,這就是你的 zsh 設定檔路徑。

步驟二:確認 .zshrc 內容

接下來要請你依照剛剛找到的路徑,打開你的 zsh 設定檔,如果輸出的路徑是 ~/.zshrc,那就請輸入以下指令

1
cat ~/.zshrc

這時候你的終端機應該會噴出一些內容,幫我找看看有沒有以下內容

1
export PATH="$PATH:'`npm config get prefix`'/bin"

如果有的話,那就代表你的 zsh 環境變數設定正確,那可能是 npm 有快取問題,只需要輸入以下指令即可

1
npm cache clean --force

這個指令是在幫我們清除 npm 快取,讓它重新下載,有時候這階段就解決了。

步驟三:手動設定 zsh 環境變數

那找不到呢?該怎麼辦?其實就是手動設定一下 zsh 環境變數,所以請打開終端機,輸入以下指令

1
echo 'export PATH="$PATH:'`npm config get prefix`'/bin"' >> ~/.zshrc

這段指令的意思是,我們要將 npm 的前綴路徑加入到 zsh 環境變數中,這樣才能夠讓你的 zsh 正常運作。

理論上到這一步之後,你的問題應該就解決了囉~

提醒

不論你是做哪一個步驟,請務必記得重新開啟終端機,讓設定檔生效,否則你的設定是不會生效的。

或者你也可以輸入以下指令,讓設定檔立即生效

1
source ~/.zshrc

結語

那什麼會發生這些問題呢?如果是 nvm 的話,可能是因為更新 Node.js 版本時,npm 的前綴路徑沒有被正確的更新,所以導致 nvmnpm 之間的衝突導致的,

但如果是直接安裝 Node.js 的話,可能是因為 npm 的前綴路徑沒有被正確的設定到 zsh 環境變數中,所以導致 zsh 無法正常使用 npm 的指令,通常這部分是出在權限不足或是忘記設定的問題。

當然也有一種狀況可能是 Mac 權限不足,如果是權限不足導致無法安裝全域套件,那就需要使用 sudo 來執行指令,所以這部分還是需要看錯誤訊息以及狀況來判斷該如何處理哩。

參考文獻