Windows 求生手冊:Cygwin

PUBLISHED ON SEP 6, 2017 — OPERATING SYSTEM

Cygwin 是一套在 Windows 上運行的類 Unix 環境,除了 shell 外,Cygwin 還提供一整套類 Unix 系統上的終端機工具,以及附帶一個 X Window 環境。透過 Cygwin,類 Unix 系統使用者可以使用熟悉的命令列工具而不需重學另一套專門的工具。在 Bash on Windows 出現以前,大概都是用 Cygwin 來得到一個類 Unix 環境。在 Windows 8 以前的版本,沒有 Bash on Windows 可用,也是使用 Cygwin。

原本的 Cygwin 較不親和,需要進行較多的調校,而 Babun 提供了一套調校過的 Cygwin 環境,省下使用者自行調校環境的時間和心力。本文會以 Babun 為基礎,介紹 Cygwin 這套軟體。

檔案結構

在 Cygwin 中,檔案結構類似 POSIX 環境,使用者會有家目錄,軟體會裝到 /usr 或其他的目錄中,在 Windows 中,整個 Cygwin 環境位於一個獨立的資料夾中,像是 C:\Cygwin 等;通常不建議直接在 Windows 下操作 Cygwin 中的目錄結構,以免造成不可預期的錯誤。

如果使用者想和系統上的資料夾及檔案互動,可以移動到以 /cygdrive 開頭的資料夾,像是使用者目錄在 Cygwin 中可能表示為 /cygdrive/c/Users/user 或其他類似的目錄。透過這種方式,我們可以很方便地處理資料夾和檔案,像是使用 Cygwin 環境中的 wget 或 git 等工具下載檔案後,再用 Windows 上其他的軟體進行後續的處理。

使用者和群組

由於 Cygwin 是 Windows 下的軟體,而不是一套作業系統,故沒有複雜的使用者和群組。基本上在 Cygwin 中,直接使用 Windows 系統的帳號,而該帳號即可同時做為一般使用者及管理者。點擊軟體即可進入 Cygwin 環境,也沒有額外的密碼。除了安裝軟體外,通常在 Cygwin 環境下都只做一般使用者的任務。Babun 可在不離開 Cygwin 環境下安裝軟體,但原本的 Cygwin 不行。

使用命令列工具

由於 Cygwin 是一個類 POSIX 的 shell 環境,在使用像是 AWK 或是 Perl 等命令列工具撰寫 one-liners 時,能夠在 POSIX 環境會比在 Windows 的 DOS 環境來得方便的多。另外,Cygwin 也支援 UTF-8 語系,對於文字串流,有一些幫助。還有一些像是 pipe 或 redirection 等 shell 的功能,方便使用者組合不同的命令列工具。例如,Emacs 在 Cygwin 下的使用效率也會比 Windows 的 DOS 環境佳。

然而,Windows 原生的軟體,無法辨識 POSIX 路徑,在 Cygwin 環境下使用時,需要以 cygpath 這套工具轉換路徑,轉換成 Windows 路徑後,再傳到 Windows 原生軟體。在下例中,呼叫 Windows 的記事本:

$ notepad "`cygpath -w /path/to/file`"

文字檔案的差異

雖然在 Cygwin 和 Windows 原生系統中,可以對同一個文字檔案用不同的工具來處理,但是這兩個系統對於文字檔案的處理上會有一些差異,主要在於 (1) 編碼 (encoding) (2) 檔案結尾 (end of line),下文將分別敘述。

目前在類 Unix 系統主流的編碼是 UTF8,但 Windows 上的文字檔案多以系統的語系為主,如果文字檔案內只有英文的話,問題會比較小,但若文字檔案內有中日韓或其他國家文字,可能會造成亂碼出現。Linux 系統上可用 iconv 這套工具來轉換文字檔案的編碼,但 Windows 沒有此工具,可用以 Perl 實作的類似工具 piconv 來轉換文字編碼。

另外一個問題是檔案結尾,由於不同系統使用的檔案結尾不同,同一份文字檔案拿到不同系統時,可能會在斷行出現問題。有些編輯器 (editor) 可自動轉換,有些工具則無法自動轉換。如果需要手動轉換,可以用 dos2unix 這套小工具來進行轉換。

由於上述問題,筆者傾向不在 Cygwin 或 Bash on Windows 這類子系統中撰寫和編輯文字檔案,而會使用 Windows 原生環境的工具來處理文字檔案。

安裝軟體

在原本的 Cygwin 中,要安裝工具的話,要關掉 Cygwin 環境,重新啟動 Cygwin 安裝程式,再挑選所需的工具。Babun 克服這個缺點,可直接在 Cygwin 環境中,用內部的套件管理軟體 pact 安裝所需的軟體。

輸入 pact find 可搜尋可用的軟體:

$ pack find arj

輸入 pact install 可安裝軟體:

$ pact install arj

有關 pact 的其他使用方法,可見 pact --help 的說明。

腳本語言

在 Cygwin 中使用腳本語言,類似於使用命令列工具,比起 Windows 的 DOS 環境,來得更方便。而且,在需要時,也可自行安裝所需的模組;如果該模組沒有用到 C/C++ 的部分,通常可以順利安裝;有些模組,已經包成 Cygwin 的套件,有些模組則需自行安裝。

編譯軟體

要注意的是,在 Cygwin 上運行的工具透過一層函式庫來模擬 POSIX,而在編譯軟體時,也會連結到這套函式庫,而和原生的 Windows 應用程式有所不同。如果需要一些 GNU/Linux 下的軟體,而 Cygwin 沒有提供,也可以試著自行編譯軟體。雖然,比起原生的 GNU/Linux 環境,Cygwin 提供的函式庫的豐富度和完整性仍有一些些差距;對於相依性較單純的軟體,時常可以成功編譯;在編譯前,可查詢一下 Cygwin 是否已提供函式庫,以免浪費時間重覆編譯。編譯成功後,執行檔即可在 Cygwin 環境中使用;然而,透過 Cygwin 環境編譯出來的軟體,不是原生的 Windows 應用程式,而依賴於 Cygwin 特有的函式庫。雖然我們也可以在 Cygwin 環境中交叉編譯出原生的 Windows 應用程式,通常會建議使用 MSYS 來編譯 Windows 原生應用程式,以免不慎混入 Cygwin 特有的的函式庫。

小結

對於在 Windows 中,又想使用 POSIX 環境下的工具,Cygwin 提供一個很好的方案。雖然不若原生的 Linux 環境來得完整,但對於一般性的任務已經足夠。Bash on Windows 出現後,和 Cygwin 有著微妙的競爭關係:雖然兩套軟體來自不同的開發團隊,操作的思維相當接近,讀者可自行選擇喜好的方案。

comments powered by Disqus