老鼠走迷宮


執行程式的兩要件: 路徑與權限

  1. 直接使用 Linux 當桌面系統的同學, 請打開一個 終端機 terminal 視窗 rxvt 或 xterm 或 gnome-term 或 konsole; 使用 XLiveCD 的同學請開一個 bash 視窗並下: ssh 帳號@主機 連線; 使用 pietty 或 putty 的同學則同樣連線到主機來。
  2. 用 lynx 瀏覽本網頁, 按上下方向鍵把遊標移到 maze 這個連結上面, 看到它顏色 (或背景) 改變, 但不要進去。 按 d 鍵下載, 選擇 "儲存至磁碟 (save to disk)", 螢幕下面出現預設的存檔名稱, 如果不滿意可以修改。 最後按 ENTER 存檔。
  3. 同樣下載 1.maz 這個資料檔。
  4. 另外開一個文字視窗, 執行 maze 1.maz 奇怪 ... 下 ls -l 明明有下載成功, shell 怎麼說找不到指令? (一定要養成注意錯誤訊息的習慣, 這對於你日後電腦是否學得好有關鍵性的影響)
  5. 改執行 ./maze 1.maz 這回錯誤訊息不一樣了, 變成 "拒絕不符權限的操作 permission denied"。
  6. 注意先前 ls -l 的時候, 最左邊的 "-rw-r--r--", 現在下 chmod u+x maTAB 然後再一次 ls -l 注意最左邊變成 "-rwxr--r--"。 (這裡的 TAB 不是按 t,a,b 三個鍵, 而是鍵盤左邊大寫鍵之上, 蚯蚓鍵之下, Q 左邊的那一個鍵。
  7. 再下一次 ./maTAB 1.maz 終於可以執行。

印出 命令提示字串 command prompt, 負責與我們對談的那支程式, 叫做 shell。 我們下指令, shell 就負責去找出指令來執行; 如果找不到指令, 它就印錯誤訊息 有點像是坐在郵局或戶政事務所, 櫃臺外面的辦事員, 他本身不處理業務, 他的工作是負責指引民眾拿正確的表格到正確窗口, 以及其他一些雜事。 Shell 有很多種, 像是 bash, tcsh, ksh, zsh, ... 等等。 我們只學最常用的 bash。 除了找指令出來執行之外, 像是上面檔案名稱快打 file name completion 與命令名稱快打 command completion, 也都是 shell 提供的服務。

Bash 並不是看到任何指令都隨便執行, 這樣太危險了。 請下 which lswhich md5sum 還有 which maze。 它只到特定的某些目錄找執行檔, 而這通常不包含目前目錄 "." 。 請下 echo $PATH 可以看到所有被 shell 搜尋的路徑 (用 : 分開)。 建議不要將 "." 加進去; 如果確定要執行目前目錄下的程式, 就要講清楚, 說明白, 像 ./maze 這樣。

這還不夠。 在 Linux 下, 一個檔案可否當做程式來執行, 不是依檔名決定, 而是依 權限 permission。 chmod 指令中間的三個字元, 意思分別是

  1. 對自己 user (也可以是 群組 group 或是所有人 all)
  2. 開放 + (也可以是關閉 -)
  3. 執行 executable 的權限 (也可以是讀取 readable 或是寫入 writable 的權限

「為什麼要學命令列這種老掉牙的東西?」 換一個角度想, 幾十年一直沒有改變的東西, 是否更有機會再活幾十年? 英文單字片語文法有多老了? 數學知識有多老了? 這些老知識, 只需要學一次, 就可以用一輩子。 而且命令列與英文數學知識一樣, 可以用很少的元素, 排列組合出很多不同的解答。 具有長遠壽命與組合特性的知識, 才是 有價值的學習投資

編輯用牛刀 -- vim

  1. vim 1.maz 編輯資料檔。
  2. 目前我們在 "正常模式 normal mode" 底下, 可以移動遊標等等, 但無法直接輸入資料。 請用 hjkl 鍵四處移動。
  3. 分別用 $ 移到一列的最後面, 再用 j 與 k 上下移動, 看看是否發現資料檔有一點小問題?
  4. 將遊標移到多出來的空格那邊, 按 x 鍵刪除。
  5. 另外開一個命令列視窗, 再執行一次 ./maze 1.maz (不要太勤勞, 記得用 file name completion 功能減少打字...)
  6. 啊, 忘記存檔。 回 vim 視窗, 打 ":w" 然後按 ENTER; 再切到命令列視窗, 按上箭頭叫出先前的指令再執行一次。
  7. 如果嫌速度太快, 可以這樣下: ./maze -d 100 1.maz 這裡是指定每步的延遲時間, 以 ms 計。

現在開始亂改迷宮吧。 遊標隨便移到畫面中間附近, 按 i 進入 "插入模式 insert mode", 注意左下角的提示。 隨便打幾個字元, 按 ESC (鍵盤最左上角那一個鍵) 回到正常模式。 以下是一些最基本的功能:

  1. 方向鍵其實也可以用來移動遊標。
  2. x 刪除一個字元; dd 刪除一列。
  3. 不小心改錯時, 按 u 可以倒退一步 (undo)。
  4. i 在遊標之前新增; a 在遊標之後新增; o 在這列之後新增; O 在這列之前新增。 不論以何種方式進入新增模式, 都用 ESC 鍵回到正常模式。
  5. :q 離開。 如果你做了一些修改, 卻還不曾存檔, 它不會讓你離開。 必須打 ":wq" 確認寫入, 或 ":q!" 確認放棄修改不存檔, 才可以離開。

現在請製作一個 10x20 的迷宮, 左右兩側由上而下的第 3,8 兩格請留空; 上下兩側由左而右的第 6,15 兩格也必須留空。 按 "3G" 可以立即跳到第三列; 按 "6|" 可以立即跳到第 6 行。

有空的時候可以下指令 vimtutor 學用 vim。

初學者一些常見的問題:

  1. 為什麼突然出現一堆黃底的字? 可能是不小心按到 "/" 這是搜尋字串的意思。 搜尋到的字串都會變成黃底。 可以再搜尋一次, 這次搜尋一串亂七八糟不存在的字串, 黃底字串就會消失。
  2. 存檔時, 下面出現紅色的錯誤訊息 'readonly' option is set (add ! to override) 怎麼辦? 不知為什麼, 你把檔案設定成唯讀了。 如錯誤訊息所說, 可用 ":w!" 強制寫入。 也有可能是你去編輯到別人的檔案, 或是目前人不在家目錄, 卻想在這裡建立新檔案。 若是這樣, 就用 ":w ~/abc.txt" 把所有內容帶回自己家目錄, 另存新檔, 或用 ":q!" 強制離開不存檔。
  3. 出現一整頁的錯誤訊息, 最下面寫 Swap file ".xxx.swp" already exists! 這很有可能是因為先前沒有按照正常手續 ":q" 離開 vim , 例如直接把 pietty 視窗關掉, 造成 vim 含冤不白... 處理方式請見錯誤訊息。

大方分享自己的創作, 是一種美德

小迷宮太無聊了, 一下子就走完; 大家合作比較好玩。 以下的操作, 假設有 george 與 mary 兩位同學, 請同學兩人一組, 各扮演一個角色。

  1. george: 看看自己家的權限開放了多少: ls -l ~
  2. george: 錯了; 其實是想看目錄本身, 不是目錄的內容, 再來一次: ls -ld ~
  3. george: 自己家要顧好, 不要隨便開放給別人: chmod 700 ~ 再檢查一次: ls -ld ~
  4. mary: 想要把 george 的迷宮檔拷貝過來用, 先看看 george 家有沒有開: ls -ld ~george 注意蚯蚓與 george 之間不要有空格。
  5. mary: 不信邪, 硬是偷窺: ls -l ~george 注意錯誤訊息說什麼。
  6. mary: 再試著闖空門: cd ~george 注意錯誤訊息說什麼。
  7. george: 哦, 是 mary 啊, 那就開門讓你進來吧: chmod a+x ~
  8. mary: 再探頭看看: ls -l ~george 咦, 還是沒有開呀?
  9. george: 有開門 (x), 沒有開燈 (r) 啦。
  10. mary: 真的嗎? ls -ld ~george 果然。 沒關係, 我知他家擺設, 摸黑進去, 東西拿了就跑: cd ~george 注意現在沒有錯誤訊息了, cp 1.maz ~/george.maz 最後回家 cd ~
  11. george: 歡迎拷貝, 不傷我一毫而利天下, 何樂而不為也! 不過燈不要隨便開著, 以免 mary 或其他人看到不該看的東西... 最常見的安排就是現在這樣: 711, 開門不開燈。

現在請對調角色, 讓另外一位同學也可以拷貝。 兩個人各多了一個檔案出來; 沒有人有任何損失, 誰的 "財產" 減少了嗎? 智慧不是財產, 創作何妨分享...

重要觀念一: 路徑與目錄

最重要的兩個指令:

  1. pwd 我現在在那個目錄裡面?
  2. cd 在目錄之間游走/切換

假設你目前位於 /home/s000123 那麼

指令 會把你帶到 這個目錄 這種寫法稱為
cd . (原地不動) 相對路徑
cd .. /home 相對路徑
cd ../../usr/X11R6 /usr/X11R6 相對路徑
cd ../s000456 /home/s000456 相對路徑
cd ~s000456 /home/s000456 絕對路徑
cd /usr/X11R6 /usr/X11R6 絕對路徑

另外, 不論你人在何處, cd ~ 都會把你帶回自己的家。

重要觀念二: 下指令的重要原則

  1. 大小寫有別!
  2. 不要隨便省略空格! (連續的空格, 通常可以省略到只剩一個)
  3. 要注意錯誤訊息!

組合的力量

  1. 編輯自己的迷宮檔: vim 1.maz
  2. (在 vim 裡面) 跳到 george 的檔案: ":e geTAB" 按 ENTER 之前, 確認左下角出現 ":e george.maz" 或是你改的檔名。
  3. 按 shift-v 進入 visual mode, 移動遊標到最下面 (注意反白的區塊變大), 按 y 複製, 反白區塊消失。
  4. 按 ctrl-6 或 ctrl-shift-6 切回原來的檔案。
  5. 遊標移到最下面 (其實按 G 比較快), 按 p 貼上, 不錯吧, 迷宮變成兩倍大了。
  6. 遊標移到第 11 列, 按 ctrl-v 進入另外一種 visual mode, 按 G 到最後一列, 再按 $ 到最後一行, 最後按 y 複製。
  7. 按 "1G" 到最上面, $ 到最右邊, 按 p 貼上。
  8. 好了, 剩下最後右下角那一塊, 請再貼一次自己的迷宮。
  9. 老鼠與乳酪太多個了, 刪一刪, 再跑一下迷宮程式吧。

vim 的 visual mode 非常好用, 選取起來之後, 除了可以按 y 複製之外, 也可以按 x 或 d 刪除。 Visual modes 有三種: v, shift-v, ctrl-v, 請自己試試看就知道它們的差別。

李果正先生有一份 大家來學 vim 講義, 內容更完整。

「用小零件拼出大東西」 這是令社會得以分工/進步/提高生產力 非常重要的觀念; 而零件相接處, 如何遵循一定的規則, 彼此才能溝通, 更是一件需要大家配合的事情。 組裝電腦, 家庭影音設備, 不同廠牌的電話/不同電信公司的門號彼此可以溝通... 我們的社會從來都是這麼做的。 如果有那一家公司故意製作與別人不能組合的零件, 社會大眾應該加以抵制。 如果別人想要加裝轉接頭以便與它相容, 卻還被它告, 那真是天理安在; 這樣的法律是在保護強盜, 侵犯人權, 而不是在保護 「智慧財產權」。

附錄一: 用 vim 製作迷宮的小技巧

  1. 按 "10a #" 及 ESC 製作一列障礙
  2. 按 "o" 及 ESC 加入一個換列
  3. 按 "20a " 及 ESC 製作一列空白
  4. 用 "k" 或 "1G" 回到第一列
  5. 按 "2yy" 記憶兩列
  6. 用 "j" 向下一列, 或 "G" 移到最後一列
  7. 按 "4p" 將剛才記憶的兩列連貼四次
  8. 按 "1G6|" 移到第一列第 6 行的位置, 按 "r+" 把底下的字元改成 +
  9. 按 "15|" 移到第一列第 15 行的位置, 按 "." 重複剛才的動作
  10. 按 "G" 跳到最後一列, "6|.15|." 一樣將第 6, 15 兩行改成 +
  11. 按 "3G0" 移到第三列的頭, 按 "." 重複剛才的動作 (改成 +)
  12. 按 "$" 移到最後, 按 "." 重複剛才的動作
  13. 按 "8G0", 對第八列重複上面兩步
  14. 牆壁太少了嗎? 隨便找一格, 按 "r#"
  15. 現在到處移動遊標, 隨你高興按 "." 建更多牆, 但不要在剛才的 "+" 上面建牆; 甚至最好確保這些 + 彼此有路相通
  16. 迷宮接近完成時, 按 ":%s/+/ /g" 及 Enter, 把所有的 + 改成空格
  17. 到你高興的位置去, 放上老鼠 "@" 與 cheese "C", 大功告成!

當然如果你嫌 vim 太難用, 也可以改用比較類似記事本的 nano, 不過它的功能就弱多了。