文件閱讀指引


GNU/Linux 上文件豐富, 不可能也不需要全部讀完. 本單元介紹如何閱讀手冊, 以最少的時間取得最需要的資訊. 使用各種手冊與文件 (線上教科書除外) 時請謹記: 不需要從頭讀到尾, 如果能夠善用 regular expression 只尋找你有興趣的部分, 將可大幅度減輕閱讀與記憶的負擔. (當然如果你對某幾個題目真的很有興趣, 精讀幾篇也會很有收穫的.)

傳統 UNIX 手冊 man

簡單範例: 用 man 1 ls 看看 ls 這個命令如何使用. man 會自動把輸出結果 pipeless, 所以進入閱讀畫面後, 即可使用 less 下的按鍵操作. 一篇手冊內經常可以看到以下段落:

  1. NAME: 命令名稱及功能簡介.
  2. SYNOPSIS: 嚴格的語法定義. 其中方括弧 [ ... ] 代表下命令時可有可無的部分. 通常都是一些修飾命令行為的 選項 (option).
  3. OPTIONS: 用來對命令行為稍加修飾, 但基本上不改變命令基本意義的東西, 例如 ls -l 要 ls 命令把每個檔案的細節都印出來; ls -a 則要 ls 不只列出一般檔案, 也列出隱藏檔. (想像成一句命令的副詞: "慢慢" 跑, "仔細" 找, "小聲" 唱, ...) 通常短選項 (short options) 可以串在一起, 例如 ls -al 但是長選項則不行, 例如 ls --versionls --help
  4. DESCRIPTION: 詳細的功能說明.
  5. ENVIRONMENT: 這個命令的行為會受到那些環境變數的影響.
  6. SEE ALSO: 還有那些相關手冊.

有些命令比較複雜, 選項本身又可以有參數, 例如 find /etc/rc.d /etc/httpd -type f -size -2k 當中, find 命令有兩個參數 (/etc/rc.d 與 /etc/httpd) 與兩個選項 (-type 與 -size) 而 d 是 -type 的參數, -2k 是 -size 的參數.

雖然我們常查的手冊解釋的都是命令類, 皆屬於第一章 (section 1), 但系統內其實還有很多其他類的手冊, 例如: mount 屬於第 8 章的「系統管理員命令」, fstab 屬於第 5 章的「系統特殊檔案」, banner 屬於第 6 章的「遊戲」, strcmp 屬於第 3 章的「C 語言副程式庫」,... 等等. 以 tcsh 手冊中的 SEE ALSO 段落為例, 可以看到 pipe(2) 表示 "請用 man 2 pipe 命令參考第二章的 pipe 手冊", 而 termcap(5) 表示 "請用 man 5 termcap 命令參考第五章的 termcap 手冊". 通常章節號碼可以省略, 但是如果同一個名稱出現在不同的兩章當中, 就需要講清楚了, 例如 passwd(1) 表示 "用來修改密碼的 passwd 命令", 而 passwd(5) 指的卻是 "系統存放密碼的特殊檔案". 每章的簡介都寫在 intro 這篇手冊當中, 例如想知道第 4 章內是那類的手冊, 就用 man 4 intro.

有時候我們連該查那一篇手冊都不知道, 就只好用關鍵字來查詢. 例如想知道系統內有那些手冊與 date 有關: man -k date 那麼又有那些手冊與 date 和 time 都有關呢? man -k date | grep time

自由軟體基金會的 info 文件

不論在那一個版本的 UNIX 上, 都可以發現許多 自由軟體基金會 所寫的程式, 在 Linux 與 FreeBSD 上尤其多. 這些程式的 man 手冊通常都強調 "info 檔內有更詳盡的資料". 例如用來比較兩個文字檔差異的 diff 命令, 它的手冊就可以用 man 1 diffinfo -f diff 來看. 不習慣 info 操作鍵的讀者, 可以安裝 pinfo 套件 (內附於 CLE 1.0 CD 中, 但內定不安裝), 用 pinfo diff 命令來讀 info 檔.

套件導向的 /usr/share/doc/*

許多相關的命令及其手冊, 其實是來自同一個套件 (package), 例如讓使用者可以在 Linux 下存取 DOS 磁片的 mcopy, mdir, mmd, ... 等等指令, 都來自 mtools 套件. /usr/share/doc 目錄下, 根據各套件分出子目錄, 裡面的檔案記載套件的作者, 出處, 版本, 版權聲明, 套件內各檔案的用途, 及其他注意事項等. 通常 README 檔是一個不錯的起點.

HOWTO 文件

HOWTO's 是任務導向的文件, 目的在幫助使用者完成一項特定任務 (例如播放各類音樂檔, 或例如撥接上網), 而不在仔細介紹某一個指令. 這是 Linux 下最常用到的文件, 當你想用你的電腦完成一件事, 但是連該看那一個命令或那一個套件的手冊都不知道時, HOWTO 文件往往是最佳入口. 例如 上網, 播放及處理聲音檔, 印表機設定, ... 等等. 可以先瀏覽 HOWTO-INDEX 這個索引檔, 看看這些 HOWTO 文件涵蓋了那些話題.

在 RedHat 系統中, HOWTO 文件放在 /usr/share/doc/HOWTO 下; 在 Slackware 系統中, HOWTO 文件放在 /usr/doc/Linux-HOWTOs /usr/doc/Linux-mini-HOWTOs 下. 你也可以到 Linux 文件中譯計劃 (CLDP) 網頁上找到部分的中譯 HOWTO 文件. 如果你用的是 中文 Linux 延伸套件 (CLE), 直接在 /usr/share/doc/HOWTO/translations/zh 目錄下就可以找到.

線上教科書

Linux Document Project (LDP) 的 "Guides: longer, in-depth books" 裡面搜集了幾本線上教科書: User's Guide (UG), System Administrator's Guide (SAG), Network Administrator's Guide (NAG), Kernel Hacker's Guide 等等. 這些文件比較像教學手冊, 而不像參考手冊, 可以考慮按順序從頭讀到尾 (雖然筆者從來沒有真的讀過). 最後, 一般的 UNIX 書籍 (不一定要是針對 Linux 的書) 也是很好的知識來源.

認識你的系統管理套件的方式

初學者往往按照 Linux 書籍一步步將系統安裝好之後, 就不知道該怎麼辦了. 「我的系統內有那些套件?」 「這個檔案是做什麼用的?」 「有什麼繪圖軟體可以用?」 要回答這些問題, 需要稍微認識你的系統 管理套件的方式. 這也可以幫助你在面臨其他問題時, 快速找到比較有用的文件 (從相關套件所包含的檔案去找)

Slackware 使用者: 在 /var/log/packages 目錄下, 記載有各個套件的簡介及屬於該套件的系統檔案, 可以到那兒去下 grep 或 perl 命令, 用 regular expression 搜尋你有興趣的資訊.

RPM 系統 (例如 RedHat, Mandrake, ...) 使用者則應熟悉 rpm -q 指令, 例如:

  1. 我的系統內裝有那些套件呢? rpm -qa
  2. 這個 /usr/bin/tixwish4.1.8.0 檔案屬於那個套件呢? rpm -qf /usr/bin/tixwish4.1.8.0
  3. 這個 tix-4.1.0.6-29.i386.rpm 套件是什麼東東, 裡面又含有那些檔案呢? rpm -qil tix (代表版本的數字部分之後都不必打)
  4. 光碟片上尚未安裝進來的 這個 tix-4.1.0.6-29.i386.rpm 套件是什麼東東, 裡面又含有那些檔案呢? rpm -qpil tix

我自己的習慣是: 只安裝最少的套件, 遇到有需要再逐一安裝, 這樣比較可以知道自己的系統內有那些套件, 也比較不會浪費磁碟空間. 那麼真的需要一個程式時, 如何知道它究竟是否在你的光碟上, 如果是, 又是在那個套件內呢? 我取得一片光碟後, 總是用 rpm -qpil 先將光碟上 (不論是否已安裝到系統內的) 所有 rpm 檔資訊放入一個目錄中 (例如叫做 ~/rpmindex). 以 Mandrake 的 CD 為例, 所有 rpm 檔放在 /mnt/cdrom/Mandrake/ 底下的 RPMS, RPMS2, RPMS3 等目錄裡面, 所以就在這個目錄內執行:

        echo '### disc 1 ###' > ~/rpmindex
        cd /mnt/cdrom/Mandrake/RPMS
        rpm -qp --qf '%8{SIZE} <%{NAME}-%{VERSION}> %{SUMMARY}\n' *.rpm >> ~/rpmindex
        (換片)
        echo '### disc 2 ###' >> ~/rpmindex
        cd /mnt/cdrom/Mandrake/RPMS2
        rpm -qp --qf '%8{SIZE} <%{NAME}-%{VERSION}> %{SUMMARY}\n' *.rpm >> ~/rpmindex
        (換片)
        echo '### disc 3 ###' >> ~/rpmindex
        cd /mnt/cdrom/Mandrake/RPMS3
        rpm -qp --qf '%8{SIZE} <%{NAME}-%{VERSION}> %{SUMMARY}\n' *.rpm >> ~/rpmindex

從此以後, 需要尋找任何程式, 就到這個目錄下 grep 或 perl 命令, 用 regular expression 搜尋你有興趣的資訊, 例如下: egrep -i '###|game' rpmindex 就可以知道那片光碟上面有什麼樣的 games。

查看文件的步驟

你要用 Linux 來做一件事 (例如想播放 midi 檔, 或例如想撥接上網), 但是文件那麼多, 要從那裡開始看起呢? 以下是我個人解決問題時, 大致的步驟.

  1. 列出幾個關鍵字: 發揮你的想像力, 有時候不一定只是將關鍵字翻譯成英文而已. 例如撥接上網, 如果用 internet 當關鍵字, 就太不明確了 (不夠 specific, 會找到太多不相干的文件); 另一方面, 撥接上網一定會牽涉到 isp, 這個關鍵字或許比較貼切. 如果你面對的是一個來歷不明的檔案, 可以先用 file 檢查它的檔案種類, 再以印出來的結果作為關鍵字. (即使你對這個種類的檔案完全沒有概念也沒有關係.) 過去下的命令所印出來的 錯誤訊息 也可能是很好的關鍵字.
  2. 找出相關套件: 用 regular expression 到 HOWTO 文件目錄, 到 /usr/share/doc/* 底下, 到你的 cdrom (或先前建立的 rpmindex 目錄) 底下搜尋你的關鍵字, 找出相關的套件. 或是用 man -k 查看有無相關命令, 並用 rpm -qf 詢問這個命令來自那個套件. 如果系統沒有安裝, 光碟上也找不到, 可以到 Linux Software Map (lsm) 去找找看有沒有功能符合你需求的套件.
  3. 找出該套件的文件: 用 rpm -qpid 看看這些相關套件有那些文件可以參考.
  4. 視需要再深究細節: 各種文件內提到的指令, 必要時再以 man 與 info 仔細查看如何使用.

作業

從 man -k 著手, 解決下列問題:
  1. 如何把一個非文字檔的內容用十六進位數字 (hexadecimal) 印出來檢查?
  2. 這個檔案 裡面有什麼東西?
  3. 這個檔案 裡面有什麼東西? (提示: 需要兩個步驟)
  4. 如何把一個 rpm 檔解開, 但不要安裝?