廣受歡迎的 Fish shell 已更新至 4.0.0 版本,標誌著其核心程式碼已完全用 Rust 重寫的重要里程碑。這一重大更新於2025年2月27日釋出,代表了近兩年的開發工作,包含超過2,600個提交,由200多名貢獻者共同完成。
Rust 重寫
Fish 4.0 最顯著的變化是將其核心程式碼從 C++ 完全重寫為 Rust。這項龐大的工程涉及修改1,155個檔案,插入超過110,000行程式碼,刪除近89,000行程式碼。儘管變更規模如此之大,Fish 團隊強調這不應對使用者產生直接影響——考慮到重寫的全面性,這是一項令人矚目的成就。
「我認為這非常令人印象深刻,他們重寫了整個 Fish 核心,但一切仍然以完全相同的方式執行(除了極少數以微小方式變化的細節,他們已列出)。」
重寫後的程式碼庫從大約55,000行 C++ 增長到75,000行 Rust。根據社群討論,這種增長很大程度上可歸因於 Rust 的格式化偏好,傾向於將程式碼分散在多行中,以及新功能的新增。一些使用者注意到 Rust 版本構建速度略慢,併產生更大的二進位制檔案——與之前 C++ 版本的2.4 MB相比,約為4.3 MB。
Fish 4.0 與 3.x 比較
功能特性 | Fish 4.0 | Fish 3.x |
---|---|---|
核心語言 | Rust | C++ |
程式碼量 | ~75,000 行 | ~55,000 行 |
二進位制檔案大小 | 4.3 MB | 2.4 MB |
構建時間(釋出版) | ~37 秒 | ~23 秒 |
依賴項 | Rust 1.70+, C 編譯器 | C++ 編譯器, C 編譯器 |
ncurses 依賴 | 否(需要 terminfo) | 是 |
Fish 4.0 的顯著變化
- 新的按鍵表示系統
- 禁止在命令位置使用展開為子命令關鍵字的變數
- qmark-noglob 功能預設啟用(? 不再作為單字元萬用字元)
- 現在會請求 XTerm 的 modifyOtherKeys 鍵盤編碼和 kitty 鍵盤協議
- 使用 Alpine.js 重寫了網頁配置介面
為什麼使用者喜愛 Fish
Fish 之所以受歡迎,主要是因為其直觀的功能開箱即用。社群討論強調,該shell最受讚賞的功能是其出色的自動補全系統,無需手動配置。其他備受稱讚的方面包括其精簡的主題/提示符系統以及透過 oh-my-fish 進行的外掛管理。
許多使用者提到,他們繼續使用 Fish 作為互動式shell,同時仍用 Bash 或 POSIX shell 編寫指令碼以保持可移植性。這種混合方法使他們能夠受益於 Fish 的使用者友好功能,同時保持與未安裝 Fish 的系統的相容性。
相容性考慮
討論中提出的一個常見問題是,由於語法差異,將 Bash 命令複製到 Fish 中偶爾會遇到摩擦。一些使用者已開發出創造性的解決方案,例如當 Bash 命令貼上到 Fish 中時,自動透過持久的 Bash 例項路由這些命令的指令碼。
重寫還導致了一些向後不相容的變更,包括新的按鍵表示系統、命令位置中變數處理的變化,以及預設啟用 qmark-noglob 功能(意味著 ? 不再作為單字元萬用字元)。此外,Fish 現在請求 XTerm 的 modifyOtherKeys 鍵盤編碼和 kitty 鍵盤協議的漸進式增強。
對於發行版維護者和開發者
轉向 Rust 意味著依賴項的重大變化。Fish 現在需要 Rust 1.70 或更高版本,而不再需要 C++ 編譯器(儘管某些膠水程式碼和測試仍需要 C 編譯器)。CMake 仍然是推薦的構建系統,最低支援版本為3.5。
另一個值得注意的變化是 Fish 不再依賴 ncurses 庫,儘管它仍然使用 terminfo 資料庫。建議打包者新增對包含其 terminfo 資料庫的包的依賴,而不是 curses。
基於Web的配置也已重寫為使用 Alpine.js,這與核心重寫一起代表了另一項現代化努力。
隨著 Fish 4.0 在各種包管理器和平臺上推出,它成為了如何在保持使軟體受歡迎的使用者體驗的同時完成重大重寫的一個令人印象深刻的例子。對於考慮嘗試 Fish 或從以前版本升級的使用者來說,儘管底層發生了實質性變化,但過渡應該相當順暢。