Cygwin 是一個用於 Microsoft® Windows® 操作系統的類 UNIX® 環境。它包含一個真正的 UNIX shell、一個 Portable Operating System Interface (POSIX) 模擬庫以及數千個 UNIX 實用程序。
如果您是本專欄的忠實讀者,應該已經熟悉了許多 UNIX 行話。“用管道重定向輸出”、“殺死進程” 和 “使用通配符” 等行話對於新手來說很奇怪,但是您應該很熟悉這些說法了。
![]() |
|
對於 UNIX 本身,也有各種稱呼。IBM® 大型機用戶說各種帶字母 “z” 的行話,比如 IBM z/OS® 和 System z9 Virtual Machine (z/VM);嵌套系統開發人員使用 eCos 這個詞;在聊天中還會提到其他許多風格的 UNIX,比如 Linux®、FreeBSD、Sun Solaris 和 Mac OS X。現代信息技術使用各種各樣的方言,簡直就像是聖經中巴別塔的故事。
當然,也有不少人說 Windows 術語,儘管大多數人只掌握 “指向和單擊” 這樣的簡單辭彙。經過 20 年的發展,大多數 Windows 用戶已經忘了古老的 DOS 術語。
但是,與 UNIX shell 相比,Windows COMMAND 實用程序的功能實在很差;因此,UNIX 用戶通常認為 Windows 是一種讓人灰心喪氣的平台。對於習慣於使用豐富的命令行工具集的 UNIX 軟體開發人員來說,Windows 尤其彆扭。對於 UNIX 開發人員來說,使用 Windows 簡直就像是到了陌生的外國。
幸運的是,Cygwin(見 參考資料)在 Windows 環境中提供大家熟悉的一片天地,就像是美國人在法國找到了麥當勞。
Cygwin 是一個用於 Windows 的類 UNIX shell 環境。 它由兩個組件組成:一個 UNIX API 庫,它模擬 UNIX 操作系統提供的許多特性;以及 Bash shell 的改寫版本和許多 UNIX 實用程序,它們提供大家熟悉的 UNIX 命令行界面。前一個組件是一個 Windows 動態鏈接庫 (DLL)。后一個組件是一組基於 Cygwin DLL 的程序,其中許多是用未經修改的 UNIX 源代碼編譯的。它們合在一起提供大家熟悉的 UNIX 環境。
在本期的 對話 UNIX 專欄中,我們要安裝 Cygwin,討論它的命令行界面 (CLI),並構建標準 Cygwin 發行版中未包含的開放源碼,以此體會把 UNIX 應用程序(至少是一部分 UNIX 應用程序)遷移到這個模擬環境是多麼容易。
![]() |
|
安裝 Cygwin
與這裡介紹的其他軟體不同,Cygwin 使用 Windows 安裝程序。Cygwin setup.exe 文件可以重新安裝軟體,可以添加、修改或升級 Cygwin 配置的組件。
在 Windows 系統上打開瀏覽器,通過訪問 http://cygwin.com/setup.exe 下載 Cygwin 安裝程序。安裝程序本身非常小(大約 600KB),因為大多數 Cygwin 軟體是在安裝過程中下載的。完成下載之後,按照以下步驟安裝 Cygwin:
配置安裝的窗口見圖 2。
在大多數情況下,推薦的安裝選項是合適的,也可以進行定製,但是要注意幾點:
在下一個窗口中,選擇一個存儲 Cygwin 所需的數據的目錄。不要選擇前一步中選擇的 Cygwin 目錄。 如果可能的話,應該在有至少 1GB 空閑空間的驅動器上創建或選擇一個目錄。
稍等一會兒,Cygwin 會下載當前的鏡像站點列表,讓您選擇一個鏡像站點,見圖 3。如果不確定應該選擇哪個站點,就選擇地理位置比較近的站點。
經過短暫的延遲之後,安裝程序顯示可用的類別和包的完整列表。圖 4 顯示一個類別的部分內容。單擊加號 (+) 展開對應的類別;單擊 “循環” 標誌在 Skip(忽略此包)和包的所有可用版本之間循環。如果 Cygwin 提供一個實用程序的多個版本,應該選擇滿足您的需求的實例。順便說一下,如果選擇 B 列,就會下載二進位包;選擇 S,也會下載源代碼。
在 Cygwin 中可用的包超過 1,000 個,所以應該只選擇您需要的類別和包。(安裝所有 Cygwin 包會佔用超過 800MB 的磁碟空間)。以後隨時可以添加整個類別或單獨的包:只需重新運行 Cygwin 安裝程序。(還可以在任何時候用相同的安裝程序刪除或更新包)。搜索 Cygwin 包列表(參見 參考資料),檢查您喜歡的 UNIX 實用程序是否在 Cygwin 中可用。
進度條分別反映每個包的下載進度、總下載進度和磁碟使用量。圖 5 是在我的測試計算機上在安裝期間截取的屏幕圖。
最後,安裝程序安裝軟體並(可選地)在 Start 菜單和桌面中添加快捷方式。單擊 Finish。
圖 6 顯示第一次啟動 Cygwin 時的情況:它創建您的主目錄,執行 shell 啟動文件,顯示提示。現在可以運行 UNIX 命令了!
例如,試一下 ls -a 或 type touch。后一個命令表明 touch 是可執行文件 /usr/bin/touch。
![]() ![]() |
在 Windows 中發揮 UNIX 的優勢(反之亦然)
Cygwin 在 Windows 中幾乎完整地模擬一個 UNIX shell。實際上,它把這兩種操作系統很好地結合在一起了。例如,可以運行 df -h 命令顯示 “UNIX” 機器上的空閑磁碟空間。圖 7 顯示結果。
正如 前面提到的,Cygwin 安裝目錄作為虛擬 UNIX 系統的根目錄。Cygwin 把安裝目錄中的子目錄映射到 UNIX 目錄。它以單獨的卷的形式提供 Windows 驅動器,比如 /cygwin/c。可以使用這樣的虛擬路徑啟動 Windows 程序。請嘗試輸入 /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE 從命令行啟動 Windows Internet Explorer®。(還可以使用 Tab 鍵自動展開路徑的元素)。
順便說一句,如果要把 Windows 路徑名轉換為等效的 UNIX 路徑名或者相反,可以試試內置命令 cygpath。在默認情況下,cygpath 產生 UNIX 路徑名。使用 -w 選項產生 Windows 路徑。
$ cygpath -w /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE c:\Program Files\Internet Explorer\IEXPLORE.EXE |
還有幫助溝通這兩個環境的其他特性:
例如,可以使用 UNIX find 在驅動器上搜索數據。請注意一點:在 Windows 文件名中常常使用空格。為了保持完整的文件名(請記住,UNIX 參數以空格分隔),一定要使用 find -print0 和 xargs -0。
![]() ![]() |
如何更新和擴展 Cygwin
正如前面提到的,在任何時候都可以通過運行 Cygwin 安裝程序添加、刪除和更新 Cygwin 類別和包。我們來添加幾個軟體開發包,以便像在傳統的 UNIX 系統上那樣從源代碼構建程序。
再次運行 Cygwin setup.exe 應用程序,依次通過前幾個對話框,直到到達 Select Packages 窗口,見 圖 4。展開 Devel 類別,使用循環控制項選擇以下包的最高版本:
做出選擇之後(為了滿足依賴性,可能會自動選擇其他包),單擊 Next 開始更新。與前面一樣,下載和安裝過程需要一定的時間(開發包往往相當大)。
在此期間,打開一個瀏覽器並通過訪問 http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz 下載 GNU wget 實用程序的最新源代碼。(wget 是一種命令行工具,它可以下載任何東西。關於此工具的更多信息,請參見 參考資料)。使用 Cygwin 把此文件複製到 Cygwin 中的主目錄,展開壓縮文件。清單 1 顯示壓縮文件的內容。
$ cp /cygdrive/c/Documents\ and\ Settings/Martin/My\ Documents/wget-1.11.4.tar ~ $ tar xzvf wget-11.4.tar wget-1.11.4/ wget-1.11.4/AUTHORS wget-1.11.4/NEWS wget-1.11.4/COPYING wget-1.11.4/configure.bat wget-1.11.4/ChangeLog wget-1.11.4/ChangeLog.README wget-1.11.4/msdos/ wget-1.11.4/msdos/ChangeLog wget-1.11.4/msdos/Makefile.DJ ... wget-1.11.4/src/cookies.c wget-1.11.4/src/http.h wget-1.11.4/src/log.h wget-1.11.4/src/sysdep.h wget-1.11.4/src/alloca.c wget-1.11.4/src/getopt.c wget-1.11.4/src/gnu-md5.h wget-1.11.4/src/ftp.c wget-1.11.4/config.sub wget-1.11.4/config.guess $ |
當 Cygwin 下載和安裝過程完成時,單擊 Finish。現在可以從源代碼構建 wget 實用程序了。
$ cd wget-1.11.4 $ ./configure configure: Configuring for GNU wget 1.11.4 ... creating po/Makefile $ make gcc -I. ... $ make install ... /usr/bin/install -c -m 644 ./wget.1 /usr/local/share/man/man1/wget.1 $ type wget /usr/local/bin/wget |
為了測試這個新的實用程序,在 Cygwin 中運行它並下載 wget 源代碼:
$ /usr/local/bin/wget http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz |
稍後就會得到一個新的源代碼壓縮文件。使用 Cygwin 安裝程序從 Cygwin 存儲庫獲得實用程序是最簡單的方法,但是也可以在 Cygwin 中構建下載的或自己的源代碼。在 Cygwin 中可以使用全套 UNIX 開發工具,包括最流行的腳本編程語言。
如果您不喜歡 Microsoft Visual Studio® 等 Windows 開發工具,甚至可以用 Cygwin 中的 UNIX 編譯器和工具構建原生 Windows WIN32 應用程序。(這些應用程序不在 UNIX 上運行。要想在 UNIX 上運行 Windows 應用程序,可以考慮使用 WINE。更多信息參見 參考資料)。
![]() ![]() |
結束語
Cygwin 並不是完美的 UNIX 模擬環境,但已經相當好了。核心組件的文檔很完善,而且特別方便,它們介紹了模擬 DLL 中的限制和安全風險。如果希望把複雜的 UNIX 包遷移到 Cygwin,請參考開發人員指南(參見 參考資料),評估 Cygwin 的支持是否能夠滿足您的 API 需要。
Cygwin 最棒的特性可能是它與 Windows 的集成。使用 Cygwin 和它的 UNIX 命令行來操縱系統可以大大提高生產力。建議在您的 shell PATH 變數中包含 Windows 的 Program Files 中的子目錄,這樣只需輸入程序名,就能夠啟動路徑中的任何二進位程序。
更棒的是,Cygwin 可以在同一個窗口中管理多個作業。按 Control-Z 可以暫停正在運行的作業;輸入 bg 和 fg 分別在後台和前台運行作業;輸入 jobs 管理作業列表。當然,Cygwin 還可以對輸入和輸出進行重定向,可以通過管道把一個命令的輸出發送給另一個命令。
Cygwin 真的很不錯。(責任編輯:A6)
[火星人 ] 對話 UNIX: 用 Cygwin 開放 Windows已經有772次圍觀