前言
Cygwin 是一套在 Windows 上運行的類 Unix 環境。除了提供 shell 環境外,也包含許多常見的終端機工具,並附帶一個 X Window 環境。透過 Cygwin,習慣使用類 Unix 系統的使用者,可以在 Windows 上延續既有的命令列操作方式,而不需要重新學習另一套工具。
當前定位
Cygwin 並不是 Linux,也不是 BSD,而是一個相對小眾的 POSIX 環境。由於實際使用情境較為有限,通常不太會作為主要工作環境,而是用於偶爾需要 Unix 工具時的輔助系統。
早期的 WSL 採用模擬 Linux syscall 的方式,並非完整的 Linux 環境,因此在使用上存在一些限制。在那段期間,Cygwin 仍然具有一定的定位。不過隨著 WSL 2 提供更接近原生的 Linux 環境,兩者的定位開始重疊,繼續使用 Cygwin 的必要性相對降低。
如果是在較舊版本的 Windows,無法使用 WSL 的情況下,仍然可以考慮使用 Cygwin 作為替代方案。
安裝 (或重裝) Cygwin
本節展示安裝 Cygwin 的基本流程。無論是第一次安裝,或是之後新增套件,都是透過同一個安裝程式進行。
到 Cygwin 網站 下載安裝程式後,點擊以啟動該安裝程式:
Cygwin 提供 32 位元與 64 位元版本,讀者可依需求選擇。本文以 64 位元版本為例。
選擇安裝方式:
本例為首次安裝,因此選擇從網路下載套件。
選擇安裝位置:
若沒有特別需求,通常使用預設選項即可。
選擇本地套件位置:
本地套件主要用於減少後續下載所需的頻寬,建議固定在同一個位置。
因為先前選擇從網路下載套件,在這裡需要設定網路連線方式:
依系統實際情況設定即可。
選擇下載套件的站台:
一般來說,會建議選擇地理位置較近的站台。不過實務上仍可能因為連線狀況不同而有所差異,例如某些情況下,選擇其他地區的站台反而較為順利。
安裝 Cygwin 的重點在於選擇套件:
通常依需求安裝所需工具即可。若對類 Unix 系統尚不熟悉,也可以先使用預設設定,之後再依實際需求補充套件,較容易逐步理解各工具的用途。
Cygwin 安裝程式會進行最後確認:
之後即進入安裝流程。安裝時間會依所選套件數量而有所不同,通常數分鐘內可完成。
最後安裝程式會詢問是否建立捷徑:
完成後即可開始使用。若已熟悉類 Unix 系統,可直接操作;若尚不熟悉,可參考相關入門文章。
Cygwin 的檔案結構
在 Cygwin 中,檔案結構大致遵循 POSIX 慣例,例如使用者會有自己的家目錄(home directory),軟體通常安裝在 /usr 等系統目錄下。在 Windows 中,整個 Cygwin 環境會位於一個獨立資料夾,例如 C:\Cygwin。
一般不建議直接透過 Windows 檔案總管操作 Cygwin 的目錄結構,而是建議在 Cygwin 終端機中進行,以降低發生不可預期問題的可能性。
若需要與 Windows 檔案系統互動,可以透過 /cygdrive 路徑存取。例如,使用者目錄可表示為 /cygdrive/c/Users/user。透過這種方式,可以在 Cygwin 中處理檔案,再交由 Windows 上的其他工具進一步使用。
在 Cygwin 中通常不需管理使用者和群組
由於 Cygwin 是運行在 Windows 上的環境,而非完整作業系統,因此並沒有傳統 Unix 系統中複雜的使用者與群組管理機制。一般會直接使用 Windows 的帳號,同時具備一般使用者與管理者的角色。
通常只需點擊程式即可進入 Cygwin 環境,不需要額外登入。除安裝軟體外,多數操作也會以一般使用者身分進行。
原本的 Cygwin 在安裝套件時,需要離開終端機並重新執行安裝程式;而 Babun 則提供在 Cygwin 環境中直接安裝套件的方式。
在 Cygwin 中使用命令列工具
由於 Cygwin 提供 POSIX 的 shell 環境,在使用 AWK 或 Perl 等工具撰寫 one-liner 時,通常會比在 Windows 的 DOS 環境中來得方便。此外,Cygwin 支援 UTF-8 語系,對於文字處理也有一定幫助。
同時,像是 pipe 或 redirection 等 shell 功能,可以讓使用者更靈活地組合不同的命令列工具。例如,在這樣的環境下使用 Emacs,通常也會比在 DOS 環境中來得順手。
不過需要注意的是,Windows 原生軟體無法直接辨識 POSIX 路徑。在 Cygwin 環境中呼叫 Windows 程式時,需要透過 cygpath 將路徑轉換為 Windows 格式。例如:
$ notepad "`cygpath -w /path/to/file`"
在某些情境下,仍然會需要搭配 Windows 原生工具。例如 OpenJDK 在支援度上通常優於 GNU 的 GCJ,因此可以在 Cygwin 環境中編譯 Java 程式,再搭配 Windows 工具使用。
文字檔案的差異
雖然在 Cygwin 與 Windows 環境中可以對同一份文字檔案使用不同工具處理,但兩者在文字處理上仍存在一些差異,主要包括:(1) 編碼(encoding)與 (2) 檔案結尾(end of line)。
在類 Unix 系統中,UTF-8 是較常見的編碼方式;而 Windows 則多依系統語系而定。若檔案僅包含英文,通常影響較小;但若包含中日韓等文字,則可能出現亂碼。
在 GNU/Linux 系統中,可使用 iconv 進行編碼轉換;而在 Windows 上,則可透過 Perl 附帶的 piconv 工具達成類似功能,其使用方式與 iconv 大致相同。
另一個差異在於檔案結尾。不同系統使用不同的換行格式,可能導致顯示或處理上的問題。有些編輯器可自動處理,但若需要手動轉換,可以使用 dos2unix 等工具。
基於上述差異,有些使用者會傾向避免在 Cygwin 或 Bash on Windows 等子系統中直接編輯文字檔案,而改用 Windows 原生工具進行處理。
安裝 Cygwin 套件
安裝新套件需要關閉終端機並重新執行安裝程式,再選擇所需工具。
選擇腳本語言
多數常見的腳本語言,例如 Perl、Python、Ruby 等,都可以在 Cygwin 上使用。對於不涉及 C、C++ 或 Fortran 的套件,通常可以順利安裝。
若需要使用延伸套件,則需額外安裝對應的函式庫。常見函式庫通常已有對應的 Cygwin 套件;若未提供,則可能需要自行編譯,其流程與一般類 Unix 系統大致相同,例如使用 Autotools(GNU Build System)。
標準 C 函式庫
Cygwin 並未使用 GNU 的 glibc,而是採用 Red Hat 所提供的 C 標準函式庫。該函式庫原本用於嵌入式系統,經過補強後已可支援一般用途。
整體而言,其 C API 與 glibc 相當接近,但在某些細節上仍可能存在差異。
在 Cygwin 中編譯軟體的問題
需要注意的是,Cygwin 透過特定的 DLL(動態函式庫)來模擬 POSIX 環境,因此在該環境中編譯出的軟體,通常會依賴這些 DLL,而與原生 Windows 應用程式有所不同。
若 Cygwin 未提供某些 GNU/Linux 軟體,也可以嘗試自行編譯。對於相依性較單純的專案,通常有機會成功;但在編譯前,仍建議先確認是否已有現成套件,以避免重複投入時間。
編譯完成後的程式可在 Cygwin 環境中執行,但並非原生 Windows 應用程式,而是依賴 Cygwin 函式庫。
若需要產生原生 Windows 應用程式,通常會建議使用 msys2 等工具進行編譯,以降低誤用 Cygwin 函式庫的風險。
結語
在 Windows 環境中,若希望使用 POSIX 工具,Cygwin 仍然是一個可行的方案。雖然不如原生 Linux 環境完整,但對於一般用途而言,多半已足夠。
隨著 WSL 的出現,兩者之間形成某種程度的競合關係。由於兩者設計理念相近,實際選擇仍可依個人需求與使用習慣而定。