解決 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 來執行指令,所以這部分還是需要看錯誤訊息以及狀況來判斷該如何處理哩。

參考文獻

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ