iT邦幫忙

2025 iThome 鐵人賽

DAY 18
1

嗨!歡迎回到上班族的命令列生存手冊。今天要介紹的 Shell 就是 fish (Friendly Interactive Shell),「fish 有什麼好!(激動)」讓筆者娓娓道來。讀者閱讀到這邊,應該體驗過不少 Shell 程式,像是:bash,zsh… 等。在基礎操作篇,也介紹了套上了 Framework 的 zsh 真心好用,能自動提示、顯示出錯誤的語法等好用的功能。

Fish 則是在這一塊又更上一層樓,「直接內建」上面提到的 zsh framework 的功能!開箱即用!還能做一些其他 Shell 做不到的事情。但是即使如此,fish 依然有一些限制,本章節也會說明如果遇到了該怎麼辦,繼續看下去囉。

很讚的特性

✅ 自動提示、顯示出錯誤的語法

image-001.gif

像安裝完 Frameworks 的 zsh,以前打過什麼指令就會自動提示,如果正中猜測,直接按下 → 就行了。另外,輸入的指令不存在就會直接在輸入框印出紅色。

✅ 更方便的 Tab 補完

image-002.gif

這在 zsh 也能做到,比如說想要查看 $ ls 後面可以接什麼,打完 - 號之後按下 tab 即可。就會出現選項,可以上下選擇,選項後面會提示這個指令可以做什麼。

✅ 快速切換目錄

image-003.gif

這個還真的沒看過其他的 Shell 做過,更換完目錄之後可以直接用 Meta + 左 或是 Meta + 右 (一般來說 Meta 鍵是 Alt 鍵,mac 上是 option 鍵)切換目前的目錄。

✅ 自帶一些好用的指令

fish 內建一些用起來很方便的指令,例如:

  • math
  • count

math 可以拿來做簡單算術,直接在 math 後方輸入算式即可。

$ math 3 + 2

會印出 5。又如 count 指令,前幾章節學到 $ wc --lines , count 是 fish 提供算數量的指令,結合之前學到的 pipe,可以這樣子來查看目前目錄下有多少個檔案:

$ ls | count

或是算文字文件有多少行:

$ cat Sample.java | count

就會印出行數。

✅ 自帶一些好用的快速鍵

Alt + S

擷取前一個指令,直接在前方加上 sudo。

Alt + P

擷取前一個指令,在後方加上 Pager。有輸入訊息的話就是直接在後面。

$ <前一個指令> | pager

Alt + E

開啟預設的文字編輯器來編輯指令,指令超複雜超長,這個很好用!

Alt + H

在指令後面直接輸入,開啟他的 man page

Alt + W

在指令後面直接輸入,會跳出指令的簡介

Alt + L

幫你自動輸入並執行 ls

Ctrl + X

複製目前的指令,或是 fish 可以選擇到的東西

✅ Rust
沒事,只是想題一下…

安裝

各大發行版和 macOS 安裝起來都很容易,只需要使用套件管理程式即可安裝,以 Fedora 來說就是:

$ sudo dnf install fish

在 macOS 或是 homebrew

$ brew install fish

隨安裝即用,安裝好後輸入 $ fish 進入。

調整預設的 Shell,請使用設定檔 (Profile) 的方式設定,請參考第 11 篇更換 Shell,的操作方式更換即可。

我真的很想換掉預設的 Shell

已經到進階觀念,也是時候說明 chsh (Change Shell) 指令。還記得第 11 篇提到的,Terminal Emulator App 在設定預設 Shell 時,會問執行指令嗎?也就是用 which 去取得指令的位置。

現在請用 which 取得 fish 的位置。

$ which fish

如果系統在 /etc/shells 找不到

mac 或一些發行版,需要把 fish 放在合法的 Shell 列表之中,需要去修改 /etc/shells 。這不在家目錄之中,需要超級使用者才能編輯。用 nano 開啟這個檔案:

https://ithelp.ithome.com.tw/upload/images/20251002/20141615BhvH9cJdig.png

$ sudo nano /etc/shells

https://ithelp.ithome.com.tw/upload/images/20251002/201416158jDptCkHmz.png

在最後一行加入從 which 取得的位置,存檔離開。

https://ithelp.ithome.com.tw/upload/images/20251002/20141615duPulyNTd9.png

可以用 $ cat /etc/shells 來確認有沒有成功加進去

更換預設 Shell

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

https://ithelp.ithome.com.tw/upload/images/20251002/20141615nBz9p07FE2.png

可以注意到這邊送的是 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 名稱>"

https://ithelp.ithome.com.tw/upload/images/20251002/20141615N2i15Rtwmg.png

不過,fish 其實可以透過圖形化界面來客製化,就是直接下 fish_config 指令!只不過筆者在 WSL 都無法正常開起來,其他平台的讀者務必嘗試看看,這個功能超讚!!
讀者在體驗 fish 之後,可以自行選擇最喜歡的 Shell 繼續閱讀即可。

還記得之前提到的 Standard Input、Standard Output 嗎?下個章節會來多介紹一些觀念和這個有關的,我們下次見囉。

補充資料:chsh

chsh 到底是修改了什麼呢?它調整了 /etc/passwd 裡頭自身帳號的 Shell 設定。讀者可以自行 cat 這個檔案來查看:

$ cat /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20251002/20141615qx2DTpZ0pg.png

這個調整完,影響登入後的 $SHELL 環境變數。Terminal Emulator 預設的行為,就是一打開會讀取 $SHELL 變數去開啟對應的 Shell。

讀者能用 echo 來看看目前這個環境變數的內容是什麼:

$ echo $SHELL

https://ithelp.ithome.com.tw/upload/images/20251002/201416157hLDeU7ZEV.png


上一篇
Day17 基礎操作篇:連環新接龍,pipe 多個指令
下一篇
Day19 進階觀念篇:重新導向和 tee
系列文
上班族的命令列 (CLI) 生存手冊25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
chiaominchang222
iT邦新手 5 級 ‧ 2025-10-02 20:33:57

快速切換讚讚讚 github也很酷

1
AndyAWD
iT邦新手 2 級 ‧ 2025-10-02 22:28:42

我這個人很簡單,有 fish 就按讚

我要留言

立即登入留言