fish shell 是可以代替 macOS 預設 bash 的另一個 shell 選擇。fish 有語法高亮(syntax highlighting)以及指令提示等功能,對常使用 CLI 的開發者來說相當便利。

安裝 iTerm2

由於 macOS 預設的 Terminal 終端機過於陽春,所以我們使用 iTerm2 來搭配 fish shell。

使用 Homebrew Cask 安裝 iTerm2:

$ brew cask install iterm2

安裝 fish shell

$ brew install fish

將 fish 設為預設 shell

$ echo "/usr/local/bin/fish" | sudo tee -a /etc/shells
$ chsh -s /usr/local/bin/fish

只在 iTerm2 中使用 fish

如果只想在 iTerm2 中使用 fish,可以在:

iTerm 2 -> Preferences -> Profiles -> General

設定 Command 為 /usr/local/bin/fish

將預設 shell 改回 bash

若要將預設 shell 從 fish 改回 bash:

$ chsh -s /bin/bash

設定 iTerm2 顯示顏色

iTerm 2 -> Preferences -> Profiles -> Colors

選擇 Color Presets… 為 Solarized Dark

設定 fish shell 環境變數

由於 fish 並不相容 bash,所以環境變數的設定也不太一樣。

這裡以 Go 做為範例,原本在 bash 的 GOPATH 環境變數設定指令:

$ echo "export GOPATH=$HOME/go" >> ~/.bash_profile
$ echo "export PATH=$PATH:$GOPATH" >> ~/.bash_profile

在 fish 則是:

$ echo "set -g -x GOPATH $HOME/go" >> ~/.config/fish/config.fish
$ echo "set -g -x PATH $PATH $GOPATH" >> ~/.config/fish/config.fish

設定完畢後重新載入 fish shell 設定檔即可:

$ source ~/.config/fish/config.fish

設定 fish shell 配色及提示

fish 內建多種配色以及提示功能,若有使用 Git 還可以直接看到目前所在的分支名稱、檔案異動狀態等資訊。

開啟 fish shell 的設定頁面:

$ fish_config

※點選 Set 按鈕之後請等待點秒鐘,看到 Set! 才代表設定成功。完成設定後,須在 CLI 按下 Enter 結束。

解決 NVM 無法在 fish shell 下執行問題

同樣因為 fish 不相容 bash,也導致 NVM 中的 nvm.sh 無法正常在 fish 中執行。我們可以透過 fish 的套件管理工具—fisherman 來安裝 Fish-nvm 以支援 NVM。

假設已透過 Homebrew 安裝完 NVM,接著安裝 fisherman:

$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisher

透過 fisherman 安裝 Fish-nvm:

$ fisher nvm

建立 symbolic link 指向由 Homebrew 所安裝 NVM 的 nvm.sh,讓 Fish-nvm 能夠找到:

$ ln -s (brew --prefix nvm)/nvm.sh ~/.nvm/nvm.sh

設定 NVM 的 NVM_DIR 環境變數:

$ echo "set -g -x NVM_DIR $HOME/.nvm" >> ~/.config/fish/config.fish

最後,為了讓 npm 安裝的全域套件可以正常使用(如:webpackflow 等指令):

$ echo "bass source $NVM_DIR/nvm.sh" >> ~/.config/fish/config.fish

※若是沒有加入此設定,則在執行 nodenpm 之前,全域套件的指令會無法使用

在 fish shell 中執行 bash script

雖然 fish 並不相容 bash,但仍可透過 Bass 來執行 bash script:

$ bass export X=3