位元詩人 [Windows] 程式設計教學:Cygwin 環境入門教學

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

許多 Cygwin 的使用者在類 Unix 系統玩很久,偶爾要在 Windows 做事時,用來當成一個臨時的類 Unix 環境;不過,也有一部分使用者不想直接跳類 Unix 系統,但想要有一個方便的終端機環境,這時候 Cygwin 就是一個很好的方案,本文即是以此出發點來撰寫。

Cygwin 簡介

雖然微軟推出 Bash on Windows,但我們這裡還是先介紹 Cygwin,因為 Bash on Windows 僅於 Windows 10 才能取得,而目前還有一部份使用者繼續使用 Windows 7 (約 44%) 或 Windows 8 (約 6%) (根據 NetMarketShare 的資料)。此外,Bash on Windows 和 Cygwin 的使用哲學其實差不多,學了 Cygwin 後轉 Bash on Windows 不會太困難,基本上都是拿類 Unix 系統的那套思維來操作。

如果要使用 Cygwin,建議使用 Babun,而非原本的 Cygwin。Babun 的終端機環境也是跑 Cygwin,但額外加上一些調校 (tweak),使用起來會比原來的 Cygwin 順手一些。當然,如果願意花時間,也可以自己調校原本的 Cygwin,用 Babun 的好處是省下初期調校的時間。本文假設讀者使用 Babun,大部分的情境也適用於原本的 Cygwin。

由於 Cygwin 是一個相對小眾的類 Unix 運行環境,Cygwin 的專書很少,Cygwin 官方的 Cygwin User Guide 比較像是參考指引 (reference) 而非教程 (tutorial),沒用過類 Unix 系統的使用者即使看了那本書大概也學不太起來;除此之外,就是少數以日文撰寫的 Cygwin 書籍。

不過,不用擔心,大部分的 Cygwin 使用者並不是藉由 Cygwin 的專書來學習 Cygwin,而是直接把先前對 GNU/Linux 或 BSD 或其他類 Unix 系統的使用經驗套進來,通常也可以順利運行;少數無法正確運行的情境,有可能是 Cygwin 系統的限制,這些問題在原生的類 Unix 系統上不一定會發生。

有一些教材會用 Cygwin 來教 C 或 C++ 程式設計,這倒也無可厚非。只是在預設情形下,Cygwin 環境內編譯的 C 或 C++ 程式不是原生的 Windows 程式,而會額外相依於 Cygwin 特有的動態連結函式庫 (cygwin1.dll),這個檔案主要是用來模擬 POSIX 系統的 API。

Cygwin 可用交叉編譯 (cross-compiling) 來編譯 Windows 原生程式,但不如用我們先前介紹的 MSYS2 來得簡單 (可看這裡)。

開始使用 Cygwin

進入 Cygwin 環境的方式是透過其終端機模擬器,點擊其圖示後即可進入:

$

命令列環境平常是等待狀態,待使用者輸入指令才會產生相對應的動作。由於命令列環境沒什麼提示訊息或使用者界面,一開始會覺得比較難,這是正常現象。

輸入指令的方式是用鍵盤打指令,之後按 Enter 鍵,系統即會反應。在這個例子中,我們輸入 ls (記成 list) 指令:

$ ls
bin  c  cygdrive  d  dev  etc  home  lib  proc  sbin  setup  tmp  usr  var
$

指令結束後,系統又會回到提示字元,等待下一個指令。

輸入指令時,可以加入參數,以改變指令的行為。像是在輸入 ls 時加上 -a 參數,會顯示出隱藏檔案:

$ ls -a
.         .bash_profile  .inputrc  .minttyrc   .profile  .zcompdump          .zshrc
..        .bashrc        .lesshst  .oh-my-zsh  .ssh      .zcompdump-T2-5.0.6  .zsh-update
.babunrc  .gitconfig     .local    .pact       .vim      .zsh_history         bin

類 Unix 系統的參數是用 - (dash) 來區隔,和 DOS 系統的參數相異,需注意。

獲得說明文件

許多指令都有 -h 或是 --help 參數,該參數就是內建的參數說明手冊:

$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

(省略一些內容)

學習查閱內建說明相當重要,不論是網路上的教學文件或是實體書籍,頂多算是第二手資料。但自己系統內的指令所附的說明,才是該指令實際可用的參數。隨著版本相異,命令列程式的可用參數會不同,所以一定要學著查系統內建說明文件。

附帶一提,如果說明過長,可用 ls --help | morels --help | less 慢慢捲動,比較容易閱讀。

如果要查更詳細的說明,可透過 man (記成 manual) 來查閱手冊。同樣以 ls 為例:

$ man ls

可看到以下畫面:

LS(1)                                     User Commands                                     LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alpha‐
       betically if none of -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              scale sizes by SIZE before printing them; e.g., '--block-size=M'  prints  sizes  in
              units of 1,048,576 bytes; see SIZE format below

       -B, --ignore-backups
              do not list implied entries ending with ~

(省略一些內容)

man 預設使用 less 來捲動手冊內容,使用方式和 less 相同,按 f (記為 forward) 向下捲動,按 b (記為 backward) 向上捲動,按 q (記為 quit) 離開。

說實在的,類 Unix 系統的內建手冊文筆精實,寫作風格較偏參考指引 (reference),而非教程 (tutorial),要靠直接閱讀手冊來學習比較困難。通常一開始還是要有一本類 Unix 系統的入門教材比較容易系統性地學習類 Unix 系統的使用方式。目前來說,就是找 GNU/Linux 或 BSD 系統 (像 FreeBSD 等) 的教材,翻到命令列程式的章節即可。

註:有少數以 macOS 的 Unix 終端環境為主軸的教材,像 Learning Unix for Mac OS X (O'Reilly),也可以參考。

系統內建指令 (Built-in)

有些常用的指令,像是 cd 等,是 shell 內建指令,會找不到專用的手冊。在 Babun 環境中,預設使用 Zsh,可在 zshbuiltins 手冊中找到 cd 的用法,節錄如下:

cd [ -qsLP ] [ arg ]
cd [ -qsLP ] old new
cd [ -qsLP ] {+|-}n
              Change the current directory.  In the first form, change the current  directory  to
              arg,  or  to  the value of $HOME if arg is not specified.  If arg is `-', change to
              the previous directory.

              Otherwise, if arg begins with a slash, attempt to change to the directory given  by
              arg.

(省略一些訊息)

如果讀者使用 Bash,也可以在 bash 手冊中找到相對應的內容。

和 Windows 系統互動

如果要和 Windows 上的檔案和目錄互動,可以移動到 /cygdrive 目錄,就可以從終端機接觸這些內容:

$ cd /cygdrive
$ ls
c  d

在這個例子中, /cygdrive/c 對應 Windows 上的 C: 磁碟機,其他磁碟同理可知。

/cygdrive 的對檔案和目錄的操作,會實際影響系統檔案,請讀者小心操作,不要誤刪了檔案或目錄。

繼續深入

學命令列環境,通常都是先學和檔案處理相關的指令,在類 Unix 系統上幾個常見的相關指令如下:

  • ls:顯示某目錄內的檔案和子目錄
  • cd:改變所在的目錄
  • mv:移動檔案或目錄
  • cp:複製檔案或目錄
  • rm:移除檔案或目錄 (不可逆)
  • mkdir:建立目錄
  • pwd:顯示目前所在的目錄

剛開始學類 Unix 系統時會犯的錯誤就是試圖去記憶或背誦指令,最好的學習方式是藉由長期實際使用來學習。

本文較著重於使用 Cygwin 終端機的過程,有關 Cygwin 本身的知識,可參考這篇文章

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。