Windows 求生手冊:Cygwin 環境入門

PUBLISHED ON MAY 17, 2018 — OPERATING SYSTEM
FacebookTwitter LinkedIn LINE Skype EverNote GMail Email Email

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

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

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

    由於 Cygwin 是一個相對小眾的類 Unix 運行環境,Cygwin 的專書很少,Cygwin 官方的 Cygwin User Guide 比較像是參考指引 (reference) 而非教程 (tutorial),沒用過類 Unix 系統的使用者即使看了那本書大概也學不太起來;除此之外,就是少數的日文書。不過,不用擔心,大部分的 Cygwin 使用者都是直接把先前的 GNU/Linux 或 BSD 或其他類 Unix 系統的知識套進來,通常也可以順利運行;少數無法正確運行的情境,有可能是 Cygwin 系統的極限,這些問題在原生的類 Unix 系統上不一定會發生。

    有一些教材會用 Cygwin 來教 C (或 C++),這倒也無可厚非,只是在預設情形下,Cygwin 環境內編譯的 C (或 C++) 程式不是原生的 Windows 程式,而會額外相依於 Cygwin 特有的 DLL 檔,這個檔案主要是用來模擬 POSIX 系統的 API。Cygwin 也可用交叉編譯 (cross-compiling),但不如用我們先前介紹的 MSYS2 來得簡單 (可看這裡)。

    註:POSIX 是 IEEE 所制定的 Unix 系統標準。

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

    $
    

    命令列環境要等待使用者輸入指令才會產生相對應的動作,一開始會覺得比較難。

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

    $ 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
    

    許多指令都有 -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 系統的入門教材比較好,目前來說,就是找 GNU/Linux (較多使用者) 或 BSD 系統 (像 FreeBSD 等) 的教材。

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

    附帶一提,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 上的檔案和目錄互動,可以移動到 */cygdrive*,就可以從終端機接觸這些內容:

    $ cd /cygdrive
    $ ls
    c  d
    

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

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

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

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