嗨!歡迎回到上班族的命令列生存手冊。今天要介紹的 Shell 就是 fish (Friendly Interactive Shell),「fish 有什麼好!(激動)」讓筆者娓娓道來。讀者閱讀到這邊,應該體驗過不少 Shell 程式,像是:bash,zsh… 等。在基礎操作篇,也介紹了套上了 Framework 的 zsh 真心好用,能自動提示、顯示出錯誤的語法等好用的功能。
Fish 則是在這一塊又更上一層樓,「直接內建」上面提到的 zsh framework 的功能!開箱即用!還能做一些其他 Shell 做不到的事情。但是即使如此,fish 依然有一些限制,本章節也會說明如果遇到了該怎麼辦,繼續看下去囉。
像安裝完 Frameworks 的 zsh,以前打過什麼指令就會自動提示,如果正中猜測,直接按下 → 就行了。另外,輸入的指令不存在就會直接在輸入框印出紅色。
這在 zsh 也能做到,比如說想要查看 $ ls
後面可以接什麼,打完 -
號之後按下 tab 即可。就會出現選項,可以上下選擇,選項後面會提示這個指令可以做什麼。
這個還真的沒看過其他的 Shell 做過,更換完目錄之後可以直接用 Meta + 左 或是 Meta + 右 (一般來說 Meta 鍵是 Alt 鍵,mac 上是 option 鍵)切換目前的目錄。
fish 內建一些用起來很方便的指令,例如:
math 可以拿來做簡單算術,直接在 math 後方輸入算式即可。
$ math 3 + 2
會印出 5。又如 count 指令,前幾章節學到 $ wc --lines
, count 是 fish 提供算數量的指令,結合之前學到的 pipe,可以這樣子來查看目前目錄下有多少個檔案:
$ ls | count
或是算文字文件有多少行:
$ cat Sample.java | count
就會印出行數。
擷取前一個指令,直接在前方加上 sudo。
擷取前一個指令,在後方加上 Pager。有輸入訊息的話就是直接在後面。
$ <前一個指令> | pager
開啟預設的文字編輯器來編輯指令,指令超複雜超長,這個很好用!
在指令後面直接輸入,開啟他的 man page
在指令後面直接輸入,會跳出指令的簡介
幫你自動輸入並執行 ls
複製目前的指令,或是 fish 可以選擇到的東西
✅ Rust
沒事,只是想題一下…
各大發行版和 macOS 安裝起來都很容易,只需要使用套件管理程式即可安裝,以 Fedora 來說就是:
$ sudo dnf install fish
在 macOS 或是 homebrew
$ brew install fish
隨安裝即用,安裝好後輸入 $ fish
進入。
調整預設的 Shell,請使用設定檔 (Profile) 的方式設定,請參考第 11 篇更換 Shell,的操作方式更換即可。
已經到進階觀念,也是時候說明 chsh
(Change Shell) 指令。還記得第 11 篇提到的,Terminal Emulator App 在設定預設 Shell 時,會問執行指令嗎?也就是用 which
去取得指令的位置。
現在請用 which
取得 fish
的位置。
$ which fish
mac 或一些發行版,需要把 fish 放在合法的 Shell 列表之中,需要去修改 /etc/shells
。這不在家目錄之中,需要超級使用者才能編輯。用 nano 開啟這個檔案:
$ sudo nano /etc/shells
在最後一行加入從 which
取得的位置,存檔離開。
可以用 $ cat /etc/shells
來確認有沒有成功加進去
用 chsh
的 --shell
參數來更換目前使用者預設的 Shell:
$ chsh --shell <貼上從 which 取得的路徑>
Script 語法自成一格,和 bash、zsh 等不同。bash 和 zsh 對於標準 POSIX 語法支援度比較好,但是 fish 就「沒有這麼標準」。現在的版本(截至撰寫這邊版本是 4.0.2)有比以前稍微好一點。這也是筆者尚未把預設 Shell 改成 fish 的原因,可能會造成一些 Script 出錯,不過,這個有解決的方法,我們永遠都能叫 bash 起來做事(透過 $ bash
)即可。
基本上 Shell Script 語法還是會以 bash/zsh 的標準 POSIX 語法為主。如果有 Fish Shell Script 的需求,直接用大語言模型 (aka. AI) 轉換就行了。
讀者在網路上搜尋,應該會注意到一個 Framework 叫:oh-my-fish,一個很老牌的 Fish Framework。不過這個 Framework 已經很久沒有更新,fish 最近大更新幾乎重寫,可能會出現問題。所幸 oh-my-fish 的作者最近好像打算要來更新,在此之前,先不要使用 oh-my-fish。
現在比較推薦的管理工具是 fisher。
一樣執行作者提供的安裝 Script 就能安裝:
$ curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
在網路上可以找到不少 fish theme,就以 Catppuccin for Fish為例。直接輸入 fisher
會印出他的操作方式。
用 $ fisher install <repo>
就可以安裝主題。
$ fisher install catppuccin/fish
可以注意到這邊送的是 Github repo 的標題部份。安裝好之後,設定 fish 的 theme 即可。
$ fish_config theme save "<theme 名稱>"
不過就算不用額外安裝 theme,fish 自身就提供多種 theme 可供選擇了:
$ fish_config theme
就有多種內建的 theme 可供選擇。另外命令輸入框(Prompt),也內建了多種樣式可供選擇:
$ fish_config prompt
選好之後下
$ fish_config prompt save "<prompt 名稱>"
不過,fish 其實可以透過圖形化界面來客製化,就是直接下 fish_config
指令!只不過筆者在 WSL 都無法正常開起來,其他平台的讀者務必嘗試看看,這個功能超讚!!
讀者在體驗 fish 之後,可以自行選擇最喜歡的 Shell 繼續閱讀即可。
還記得之前提到的 Standard Input、Standard Output 嗎?下個章節會來多介紹一些觀念和這個有關的,我們下次見囉。
chsh
到底是修改了什麼呢?它調整了 /etc/passwd
裡頭自身帳號的 Shell 設定。讀者可以自行 cat
這個檔案來查看:
$ cat /etc/passwd
這個調整完,影響登入後的 $SHELL
環境變數。Terminal Emulator 預設的行為,就是一打開會讀取 $SHELL
變數去開啟對應的 Shell。
讀者能用 echo 來看看目前這個環境變數的內容是什麼:
$ echo $SHELL