man 指令:用法與選項、區段編號與 man -k 搜尋

測試環境RHEL 系列AlmaLinux 9.8man-db 2.9root 帳號Debian 12 · man-db 2.11 一般帳號
Shell 指令man, whatis, apropos位置/usr/bin/man

在 Linux 伺服器上要查看指令或設定檔的用法時,用 man 指令開啟手冊頁;不知道名稱時,用 man -k 搜尋簡短說明。在 AlmaLinux 9 與 Debian 12 伺服器上查詢 passwd 頁面的結果,Debian 12 同時有第 1 區段的指令頁面與第 5 區段的檔案格式頁面,而 AlmaLinux 9 沒有第 5 區段的頁面。

以下輸出是在 AlmaLinux 9.8 伺服器以 root 帳號、在 Debian 12 伺服器以一般帳號執行的結果。模擬器的主機名稱與連線位址為範例值。

1️⃣ man 指令基本用法

  • ↪️ 開啟頁面、畫面移動、不存在的頁面

在 man 後面寫上指令名稱,就會開啟該指令的手冊頁。man 會把頁面交給分頁程式(pager)一次輸出一個畫面,因此執行後不會馬上回到提示字元。分頁程式由 MANPAGER 或 PAGER 環境變數決定,兩者都是空的就使用 less。

把輸出交給管線時,不經分頁程式,只會輸出文字。用 head 取 [man ls] 的前 12 行,第一行有 LS(1),接著依序是 NAME、SYNOPSIS、DESCRIPTION 各節。

man ls | head -n 12
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 alphabetically if none of -cftuvSUX nor --sort  is  speci-
       fied.

第一行 LS(1) 括號裡的數字 1,是這個頁面所在的區段編號。

在頁面中,[Space] 顯示下一個畫面,[/字詞] 加 Enter 搜尋字詞。[n] 移到同一字詞出現的下一個位置,[q] 結束 man。

寫了不存在的名稱時,會出現 [No manual entry for] 錯誤,結束代碼是 16。

man no-such-cmd9
No manual entry for no-such-cmd9
echo $?
16

man 頁面的 EXIT STATUS 一節說明,16 是頁面、檔案、字詞當中至少有一項找不到時的值。用法錯誤是 1,因此指令稿可以把兩種情況分開處理。

2️⃣ man 區段編號

  • ↪️ 1 指令、5 設定檔、8 管理指令

同名頁面出現在多個區段時,man 會依既定的區段順序尋找,只開啟最先找到的那一頁。區段從 1 到 9,伺服器作業中常開的是第 1 區段的指令、第 5 區段的檔案格式與第 8 區段的管理指令。

區段收錄的頁面在 AlmaLinux 9.8 伺服器看到的例子
1可執行程式與 shell 指令ls, passwd, crontab, man
2系統呼叫(核心提供的函式)
3函式庫函式
4特殊檔案(多半在 /dev 底下)
5檔案格式與慣例,例如 /etc/passwdcrontab
6遊戲
7其他(巨集套件與慣例)
8系統管理指令,主要供 root 使用useradd, mandb
9核心常式(非標準)

crontab 的指令與設定檔格式同名,所以兩個區段都有頁面。用 [man -f crontab] 確認時,第 1 與第 5 區段的行一起出現。

man -f crontab
crontab (1)          - maintains crontab files for individual users
crontab (5)          - files used to schedule the execution of programs

不加區段編號執行 [man crontab],會開啟第 1 區段的 crontab 指令頁面。要看排程工作檔的格式,就在名稱前面寫 5。

man 5 crontab | head -n 4
CRONTAB(5)                       File Formats                       CRONTAB(5)

NAME
       crontab - files used to schedule the execution of programs

第一行變成 CRONTAB(5) 與 File Formats,NAME 那一行也不再是指令說明,而是排程工作檔的說明。

指定的區段裡沒有該名稱的頁面時,會出現錯誤。在 AlmaLinux 9.8 伺服器上為了看 /etc/passwd 的檔案格式而執行 [man 5 passwd],結果出現第 5 區段沒有頁面的錯誤。

man 5 passwd
No manual entry for passwd in section 5

在 Debian 12 伺服器上,[man -f passwd] 也一併列出第 5 區段的 passwd 那一行。哪個區段有頁面,取決於伺服器上安裝的手冊,所以加上區段編號之前,先用 [man -f] 確認。

man -f passwd
passwd (1)           - change user password
passwd (1ssl)        - OpenSSL application commands
passwd (5)           - the password file

第 8 區段收錄的是主要由 root 帳號執行的管理指令,例如建立帳號的 useradd。

man -f useradd
useradd (8)          - create a new user or update default new user information

3️⃣ man 指令選項與 -k、-f 搜尋

  • ↪️ whatis、apropos 與 man -w 檔案位置

[man -f] 會輸出同名頁面的一行說明,動作與 whatis 相同。在 AlmaLinux 9.8 伺服器上執行 [man -f passwd] 與 [whatis passwd],輸出了相同的兩行。

man -f passwd
passwd (1)           - update user's authentication tokens
passwd (1ossl)       - OpenSSL application commands

1ossl 那一行是共用 passwd 這個名稱的 OpenSSL 指令頁面。

不知道名稱時,用 [man -k] 搜尋頁面名稱與簡短說明。動作與 apropos 相同,字詞會當成正規表示式讀取。

man -k '^passwd'
passwd (1)           - update user's authentication tokens
passwd (1ossl)       - OpenSSL application commands

^ 代表行首,所以只列出以 passwd 開頭的行。也可以用說明裡的字詞來找,[man -k 'directory contents'] 除了 ls,還找到 dir、vdir 頁面。

man -k 'directory contents'
dir (1)              - list directory contents
ls (1)               - list directory contents
vdir (1)             - list directory contents

[man -k] 只搜尋 NAME 一節的簡短說明,所以用選項名稱或內文的字詞找不到頁面。連內文也搜尋的 [man -K] 會逐一讀取所有頁面,需要很長的時間。

找不到要搜尋的字詞時,會出現 [nothing appropriate],結束代碼是 16。

man -k no-such-word9
no-such-word9: nothing appropriate.
echo $?
16

[man -w] 不開啟頁面,只輸出原始檔的位置。

man -w ls
/usr/share/man/man1/ls.1.gz
man -w 5 crontab
/usr/share/man/man5/crontab.5.gz

這兩個檔案位於 /usr/share/man 底下的 man1 與 man5 資料夾,資料夾名稱裡的數字與區段編號相同。用 [man -w 1ossl passwd] 找到的 1ossl 頁面檔,也在與第 1 區段相同的 man1 資料夾裡。

選項整理在下方兩個分頁。

選項複製說明
-f, --whatis輸出同名頁面的一行說明。動作與 whatis 相同
-k, --apropos搜尋頁面名稱與簡短說明。動作與 apropos 相同
-w, --where, --path, --location不開啟頁面,只輸出原始檔的位置
-a, --all依序輸出所有名稱相符的頁面
選項複製說明
-K, --global-apropos在所有頁面的內文中搜尋字詞。需要很長的時間
-S, -s, --sections清單以逗號或冒號分隔的清單,指定要搜尋的區段與順序
-P, --pager分頁程式指定用來輸出頁面的分頁程式。預設值是 less
-M, --manpath路徑指定尋找頁面的手冊路徑
-L, --localelocale指定這次執行要使用的 locale
-l, --local-file不搜尋系統手冊,把指定的檔案當成頁面輸出
-u, --update更新已安裝頁面的索引快取
-V, --version輸出版本資訊

🔲 man 指令模擬器

在下方模擬器中,可以用 [man ls] 開啟頁面,再用 [Space]、[/list]、[n]、[q] 按鈕翻動畫面。在同一台虛擬伺服器上,也可以像 [man 5 crontab] 那樣加上區段編號,或輸入 [man -f]、[man -k]、[man -w]。

man 指令模擬器man-db 2.9 · root 帳號
[root@server work]#
只在瀏覽器內運作。在頁面畫面中按 Space、/字詞、n、q 按鈕,並用鍵盤的 ↑↓ 叫回先前輸入過的指令。

4️⃣ man 頁面結構

  • ↪️ 閱讀 NAME、SYNOPSIS、DESCRIPTION、OPTIONS

man 頁面分成幾個以大寫標題開頭的節。只用 grep 取出節標題來比較,ls 頁面的選項說明放在 DESCRIPTION 裡,而 crontab 頁面另有 OPTIONS 一節。

man ls | grep -E '^[A-Z]+( [A-Z]+)*$'
NAME
SYNOPSIS
DESCRIPTION
AUTHOR
REPORTING BUGS
COPYRIGHT
SEE ALSO
man crontab | grep -E '^[A-Z]+( [A-Z]+)*$'
NAME
SYNOPSIS
DESCRIPTION
OPTIONS
CAVEATS
SEE ALSO
FILES
STANDARDS
DIAGNOSTICS
AUTHOR

節的名稱每個頁面略有不同,常見的節如下。

節內容
NAME名稱與一行說明(man -f 與 man -k 輸出的那一行)
SYNOPSIS指令的寫法
DESCRIPTION動作說明(ls 頁面的選項說明也在這一節)
OPTIONS每個選項一段
EXIT STATUS結束代碼的意義
FILES指令讀取或寫入的檔案
SEE ALSO可一併參考的頁面

SYNOPSIS 的符號遵循 man 頁面訂定的規則。中括號內的部分可以省略。以直線(|)隔開的選項不能同時使用,後面帶有三個點(...)的引數可以寫多次。

ls 的 SYNOPSIS 是 ls [OPTION]... [FILE]...,因此 指令選項和檔案名稱這類命令列引數都可以全部省略,也可以寫多個。

[--help] 是程式自己輸出的用法摘要,所以不經分頁程式,直接顯示在終端機上。[ls --help] 第一行的 Usage 與 SYNOPSIS 形式相同,全長 121 行,比 [man ls] 的 245 行短。

ls --help | head -n 3
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.

man 頁面還有 [--help] 沒有的 AUTHOR、SEE ALSO 等節。想快速查看單一選項時用 [--help],需要像設定檔格式或結束代碼這類分節說明時,就開啟 man。

🔢 FAQ & 推薦內容

cd 是 bash 內建的指令,所以 [man cd] 會連到彙整所有內建指令的頁面。在 AlmaLinux 9.8 伺服器上,[type cd] 輸出 [cd is a shell builtin],[man -w cd] 輸出 builtins.1.gz 檔案的位置。單一內建指令的用法可以直接用 [help cd] 查看。

執行 [man -a 名稱] 會依序開啟名稱相符的頁面。只想看檔案位置時,一併加上 [-w]。在 AlmaLinux 9.8 伺服器上執行 [man -w -a crontab],輸出了 man1 與 man5 資料夾中 crontab 檔案的兩行。

[man -k] 與 [man -f] 搜尋的索引由 mandb 建立並更新。因此還沒進入索引的頁面不會出現在搜尋結果裡,索引則以 root 帳號執行 [mandb] 重新建立。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 8   +   8   =