說明
系統是否擁有官方的 Unix 認證,在現代其實並不那麼重要。如今我們日常使用的 Unix 環境,大多是 Linux 或 BSD 這類「類 Unix(Unix-like)」系統。真正的傳統 Unix 反而極少遇到,通常只有大型企業為了維持嚴格的系統相容性才會繼續沿用。
因此,本文將採用較為寬鬆的實務定義,把 Linux 與 BSD 都視為 Unix 環境的一環。
測試矩陣
由於 GNU/Linux 的發行版繁多,逐一進行測試過於耗時。實際上,大多數 Linux 發行版都基於相同的 Linux Kernel 與 glibc,因此不需在過於相似的系統上重複耗費精力。
為了確保環境的相容性,建議參考以下涵蓋面完整的「Unix 測試矩陣」:
- Ubuntu:代表 Debian 體系,涵蓋最主流的使用情境。
- Fedora:代表 RHEL 體系,貼近企業級 Linux 環境。
- openSUSE:代表 SUSE 體系,驗證不同套件管理與配置邏輯。
- Alpine Linux:驗證 musl libc 的 POSIX 相容性,同時代表精簡的 Docker 容器映像檔環境。
- FreeBSD:代表 BSD 體系,用來排除「僅限 Linux(Linux-only)」的特定程式碼。
透過上述這五種系統的驗證,就能涵蓋絕大多數的現代 Unix 實務情境,實行上相當足夠。
日常使用
在挑選日常使用的系統時,建議選擇主流的 GNU/Linux 發行版,這能讓你在遇到問題時更容易找到解決方案。此外,日常使用只需要固定一個 Linux 發行版即可,畢竟「日常使用」與「相容性測試」是兩回事。
目前來看,最推薦在 Ubuntu LTS 與 openSUSE Leap 之中擇一使用。原因如下:
- Unix 工具不需盲目追新:核心的工具鏈足夠成熟,不需頻繁更新。
- 日常系統應以穩定為重:避免因系統更新而中斷原本的開發工作。
- Fedora 迭代速度過快:頻繁的大版本更新,不適合追求穩定的日常工作環境。
另外在平台選擇上,除非有特定的硬體加速需求,否則直接在 Windows 上使用 WSL(Windows Subsystem for Linux) 就足夠了。大家真正需要的是強大的命令列環境,而非堅持使用 Linux 桌面端(Desktop)。
過去 macOS 曾是許多人愛用的 Unix 開發環境,但在 WSL 問世且體驗大幅提升後,macOS 已不再是唯一的必要選擇。
Shell
日常的互動式環境不論要使用 Bash、Zsh 甚至是 Fish 等新興 Shell 都可以;但在撰寫 Shell Script(腳本)時,除非該腳本確定只在自己的特定系統上執行,否則強烈建議使用 POSIX sh 標準。
此外,為了追求最佳的跨平台相容性,撰寫 Shell Script 時應盡可能避開 GNU 專有的擴充參數,儘量保持 POSIX 或 BSD 風格的參數設計。
編輯器
在 Unix 世界中,唯一必學的是 vi(1)。請注意,這裡指的是最原始的 vi,而非 vim(1) 或 Neovim。因為 vi 是 POSIX 標準的一部分,幾乎存在於所有 Unix 系統中——包含嵌入式環境、網路通訊設備以及系統救援模式。你不需要精通它,只要掌握最基本的操作,能夠在緊急時刻編輯設定檔即可。
至於日常開發,建議採取「命令列編輯器」與「桌面圖形編輯器」各學一種的雙棲策略:
- 桌面圖形編輯器:目前多數人的首選是 VS Code,其生態系擴充功能(Plugins)豐富,且與 WSL 的遠端整合體驗極為優異。
- 命令列編輯器:這部分大家各有偏好(如 Vim、Neovim、Emacs、Helix 等),屬於信仰流派,此處便不刻意推坑,選擇自己順手的即可。
AWK
許多程式設計師會選擇跳過 AWK,主要是因為它在功能上與 Perl 有所重疊。這無可厚非,每個人都有權利選擇最順手的工具。
在現代開發環境中,AWK 的最佳定位應該是留在單行指令(One-liners) 與 簡短的自動化腳本。當你發現腳本中的 BEGIN 區塊變得過於龐大、或者開始需要試圖在程式碼中模擬複雜的資料結構時,就代表該是切換到 Perl 或 Python 的時候了。
此外,雖然由於歷史包袱,AWK 存在著許多不同的分支版本,但我們不需要為了那 0.1% 的極端相容性情境去刻意迎合古老的 AWK 語法。在現代環境中,直接在系統上安裝並使用 GNU AWK(gawk),就是最省時省力的實務作法。
Perl
雖然 Perl 並不屬於 POSIX 標準,但幾乎所有現代 Unix 系統都會預裝 Perl。唯有在資源極度受限的嵌入式環境中,才會因為容量限制而捨棄 Perl、僅保留 sh 與 AWK。因此在一般伺服器或開發環境下,我們完全可以將 Perl 視為內建的必備工具。
在撰寫 Perl 腳本時,強烈建議優先採用 Core Perl 的寫法——也就是「僅使用 Perl 的原生語法與核心內建模組(Core Modules)」,不依賴 CPAN 的第三方套件。Core Perl 撰寫的程式具有極長的生命週期與強大的跨平台能力,幾乎能在任何 Unix 系統上直接完美執行。
C 語言
C 語言最初就是為了打造 Unix 系統而誕生的系統程式語言,整個 Unix 底層本質上都是由 C API 所建構。因此,想要深入理解 Unix 環境,具備基本的 C 語言知識依然不可或缺。
然而,在現代開發中,並不建議直接使用 C 語言「從頭手刻」應用程式。由於 C 語言的抽象層級較低,開發者必須從最基礎的元件寫起,耗費大量精力去手動管理記憶體與系統資源。除非是在資源極度受限的特定環境中,否則這種做法通常不符合開發效益。
至於現代編譯型語言的選擇,大家各有偏好,這裡不主動做特定推薦。基本上,只要能滿足開發需求,不論是主流的 C++、Go (Golang)、Rust,或者是像 Pascal、Zig 這類相對小眾(Niche)但各具特色的語言,都是非常值得考慮的現代選擇。
結語
Unix 的世界浩瀚無垠,似乎永遠沒有學完的一天,你總能在某個平凡的日子裡,偶然發現某個冷門卻驚艷的實用技巧。然而,工具終究是為人服務的。只要你寫出來的程式能夠穩定運作、具備合理的異常防禦機制(Guard Code),並且能相容於大多數的 Unix 環境,這就已經是一支優秀的程式。
優化是無止境的。當程式碼的品質已經足夠好,就該適時放下對 Unix 的過度執著,把珍貴的時間留給真實的生活。