iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
IT管理

Rocky Linux 8:系統管理與維運實戰系列 第 6

第5章:取得指令使用說明幫助方法

前言

在上一章節中,學會了基本的檔案與目錄之管理以及檔案系統的目錄架構之後,在這個章節中,要教導如何取得指令的幫助與用法的說明。

man指令介紹

man指令是一種可以查詢各個在系統上指令說明的方式,通常常見的Linux手冊指印的類型如下清單:

  • 若指定section為1,則內容類型為使用者命令有可能是執行檔或者是shell腳本。
  • 若指定section為2,則內容類型為系統呼叫,像是Kernel用的例行程序呼叫等。
  • 若指定section為3,則內容類型為系統上面的函式庫之用法,通常是給開發系統程式之開發者所使用。
  • 若指定section為4,則內容類型為特殊檔案,像是裝置設備檔案等。
  • 若指定section為5,則內容類型為檔案格式,像是系統上之軟體套件的設定檔說明等。
  • 若指定section為6,則內容類型為一些有趣的程式或是指令的用法說明。
  • 若指定section為7,內容類型為通常指的是協定或是檔案系統的說明。
  • 若指定section為8,內容類型為系統管理和只能是最高權限使用者才可以執行指令說明,像是正在被系統維護的任務等。
  • 若指定section為9,內容類型為Linux Kernel API之相關用法說明,像是內部Kernel在呼叫的指令或是函式等。

在man pages操作方式

當進入到指令搜尋的說明頁面時候,會在終端機上進入到一個閱讀器,這時候需要使用到鍵盤進行瀏覽與查看,以下是筆者整理出幾個在閱讀器中操作與觀看說明文件的方法:

  • Spacebar,即空白鍵,可以在閱讀器中將說明頁面往下捲動。
  • Pagedown,即鍵盤上的「Pagedown」鍵,可以在閱讀器中以畫面方式將說明頁面往下捲動。
  • Pageup,即鍵盤上的「Pageup」鍵,可以在閱讀器中以畫面方式將說明頁面往上捲動。
  • DownArrow,即鍵盤上的往下鍵,可以在閱讀器中將說明頁面往下移動一行。
  • UpArrow,即鍵盤上的往上鍵,可以在閱讀器中將說明頁面往上移動一行。
  • D,即鍵盤中「D」鍵,可以在閱讀器中將說明頁面往下移動畫面中之一半。
  • U,即鍵盤中「U」鍵,可以在閱讀器中將說明頁面往上移動畫面中之一半。
  • /string,可以在閱讀器中,按下「/」鍵並可以輸入要在說明頁面中找尋的字串內容,輸入完搜尋字串後,按下「enter」鍵即可已開始搜尋。
  • N,即鍵盤中的「N」鍵,可以在完上述的搜尋動作之後,按下這個鍵則可以找尋下一個指定的搜尋內容所在的行數。
  • Shift+N,即鍵盤中同時按下「Shift」與「N」鍵,可以在完上述的搜尋動作之後,按下這個鍵則可以找尋上一個指定的搜尋內容所在的行數。
  • G,即鍵盤之「G」鍵,則是回到閱讀器中之說明頁面最一開始第一行。
  • Shift+G,即鍵盤同時按下「Shf0t」與「G」鍵,則是回到閱讀器中之說明頁面之最後第一行。
  • Q,即鍵盤之「Q」鍵,離開閱讀器中之說明頁面。

閱讀說明頁面方法

當進入到指令的說明頁面,都有一個固定格式,以下以清單的方式整理出格式之說明:

  • NAME:標題名稱,通常是指令名稱或是檔案名稱。
  • SYNOPSIS:指令語法的概要。
  • DESCRIPTION:指令的描述,這邊會有一兩句來描述這個指令。
  • OPTIONS:指令執行時候可以代的參數方式說明。
  • EXAMPLES:一些指令如何使用的範例。
  • FILES:列出與這個man pages有關的檔案與附錄清單。
  • SEEALSO:列出其他相關的資訊,可能是附上其他man page之標題。
  • BUGS:一些這個指令或是軟體套件的臭蟲錯誤。
  • AUTHOR:一些有關於這個軟體套件或是指令之作者資訊。

在man page中尋找關鍵字

若是使用man ls指令,則是利用man找到ls這個指令的說明與使用方式,若是帶上參數-k則是尋找有關於passwd這個關鍵字有關的說明頁面,相關執行後的輸出如下所示:

[rockylinux@workstation ~]$ man -k passwd
passwd: nothing appropriate.

出現這個原因是因為man這個指令有一個資料庫叫做mandb,這個mandb並沒有做更新或者是更新不完全,為了要讓man指令可以運作的更好,可以使用sudo mandb -c來將man指令所需要用到的資料庫再進行更新一次,因為更新mandb資料庫需要是root使用者最高權限才可以更新,而這個使用者剛好可以使用sudo指令來暫時取得最高使用者權限進行mandb之更新,相關更進一步有關於sudo的介紹,會在後面章節進行介紹;相關的更新結果之輸出如下所示:

[rockylinux@workstation ~]$ sudo mandb -c
Processing manual pages under /usr/share/man/overrides...
Updating index cache for path `/usr/share/man/overrides/man8'. Wait...done.
Checking for stray cats under /usr/share/man/overrides...
Checking for stray cats under /var/cache/man/overrides...
Processing manual pages under /usr/share/man...
Updating index cache for path `/usr/share/man/man1'. Wait...mandb: warning: /usr/share/man/man1/gdk-pixbuf-query-loaders.1.gz: whatis parse for gdk-pixbuf-query-loaders(1) failed
Updating index cache for path `/usr/share/man/man5'. Wait...mandb: can't open /usr/share/man/man5/regulatory.bin.5.gz: No such file or directory
mandb: warning: /usr/share/man/man5/regulatory.db.5.gz: bad symlink or ROFF `.so' request
mandb: warning: /usr/share/man/man5/containers-signature.5.gz: whatis parse for containers-signature(5) failed
Updating index cache for path `/usr/share/man/man3'. Wait...mandb: warning: /usr/share/man/man3/Net::libnetFAQ.3pm.gz: whatis parse for Net::libnetFAQ(3pm) failed
Updating index cache for path `/usr/share/man/mann'. Wait...done.
Checking for stray cats under /usr/share/man...
Checking for stray cats under /var/cache/man...
Processing manual pages under /usr/share/man/overrides...
Updating index cache for path `/usr/share/man/overrides/man8'. Wait...done.
Checking for stray cats under /usr/share/man/overrides...
Checking for stray cats under /var/cache/man/overrides...
Processing manual pages under /usr/share/man/ru...
Updating index cache for path `/usr/share/man/ru/man7'. Wait...done.
Checking for stray cats under /usr/share/man/ru...
Checking for stray cats under /var/cache/man/ru...
Processing manual pages under /usr/share/man/hu...
Updating index cache for path `/usr/share/man/hu/man8'. Wait...done.
Checking for stray cats under /usr/share/man/hu...
Checking for stray cats under /var/cache/man/hu...
Processing manual pages under /usr/share/man/ja...
Updating index cache for path `/usr/share/man/ja/man7'. Wait...done.
Checking for stray cats under /usr/share/man/ja...
Checking for stray cats under /var/cache/man/ja...
Processing manual pages under /usr/share/man/fr...
Updating index cache for path `/usr/share/man/fr/man7'. Wait...done.
Checking for stray cats under /usr/share/man/fr...
Checking for stray cats under /var/cache/man/fr...
Processing manual pages under /usr/share/man/it...
Updating index cache for path `/usr/share/man/it/man8'. Wait...done.
Checking for stray cats under /usr/share/man/it...
Checking for stray cats under /var/cache/man/it...
Processing manual pages under /usr/share/man/pl...
Updating index cache for path `/usr/share/man/pl/man5'. Wait...done.
Checking for stray cats under /usr/share/man/pl...
Checking for stray cats under /var/cache/man/pl...
Processing manual pages under /usr/share/man/ko...
Updating index cache for path `/usr/share/man/ko/man8'. Wait...done.
Checking for stray cats under /usr/share/man/ko...
Checking for stray cats under /var/cache/man/ko...
Processing manual pages under /usr/share/man/sk...
Updating index cache for path `/usr/share/man/sk/man8'. Wait...done.
Checking for stray cats under /usr/share/man/sk...
Checking for stray cats under /var/cache/man/sk...
Processing manual pages under /usr/share/man/cs...
Updating index cache for path `/usr/share/man/cs/man7'. Wait...done.
Checking for stray cats under /usr/share/man/cs...
Checking for stray cats under /var/cache/man/cs...
Processing manual pages under /usr/share/man/da...
Updating index cache for path `/usr/share/man/da/man8'. Wait...done.
Checking for stray cats under /usr/share/man/da...
Checking for stray cats under /var/cache/man/da...
Processing manual pages under /usr/share/man/de...
Updating index cache for path `/usr/share/man/de/man8'. Wait...done.
Checking for stray cats under /usr/share/man/de...
Checking for stray cats under /var/cache/man/de...
Processing manual pages under /usr/share/man/id...
Updating index cache for path `/usr/share/man/id/man5'. Wait...done.
Checking for stray cats under /usr/share/man/id...
Checking for stray cats under /var/cache/man/id...
Processing manual pages under /usr/share/man/pt_BR...
Updating index cache for path `/usr/share/man/pt_BR/man8'. Wait...done.
Checking for stray cats under /usr/share/man/pt_BR...
Checking for stray cats under /var/cache/man/pt_BR...
Processing manual pages under /usr/share/man/sv...
Updating index cache for path `/usr/share/man/sv/man7'. Wait...done.
Checking for stray cats under /usr/share/man/sv...
Checking for stray cats under /var/cache/man/sv...
Processing manual pages under /usr/share/man/tr...
Updating index cache for path `/usr/share/man/tr/man7'. Wait...done.
Checking for stray cats under /usr/share/man/tr...
Checking for stray cats under /var/cache/man/tr...
Processing manual pages under /usr/share/man/zh_CN...
Updating index cache for path `/usr/share/man/zh_CN/man8'. Wait...done.
Checking for stray cats under /usr/share/man/zh_CN...
Checking for stray cats under /var/cache/man/zh_CN...
Processing manual pages under /usr/share/man/zh_TW...
Updating index cache for path `/usr/share/man/zh_TW/man8'. Wait...done.
Checking for stray cats under /usr/share/man/zh_TW...
Checking for stray cats under /var/cache/man/zh_TW...
Processing manual pages under /usr/share/man/es...
Updating index cache for path `/usr/share/man/es/man1'. Wait...done.
Checking for stray cats under /usr/share/man/es...
Checking for stray cats under /var/cache/man/es...
Processing manual pages under /usr/share/man/uk...
Updating index cache for path `/usr/share/man/uk/man1'. Wait...mandb: warning: /usr/share/man/uk/man1/dos2unix.1.gz: whatis parse for dos2unix(1) failed
mandb: warning: /usr/share/man/uk/man1/dos2unix.1.gz: whatis parse for mac2unix(1) failed
mandb: warning: /usr/share/man/uk/man1/dos2unix.1.gz: whatis parse for unix2dos(1) failed
mandb: warning: /usr/share/man/uk/man1/dos2unix.1.gz: whatis parse for unix2mac(1) failed
Updating index cache for path `/usr/share/man/uk/man7'. Wait...done.
Checking for stray cats under /usr/share/man/uk...
Checking for stray cats under /var/cache/man/uk...
Processing manual pages under /usr/share/man/ca...
Updating index cache for path `/usr/share/man/ca/man8'. Wait...done.
Checking for stray cats under /usr/share/man/ca...
Checking for stray cats under /var/cache/man/ca...
Processing manual pages under /usr/share/man/nl...
Updating index cache for path `/usr/share/man/nl/man1'. Wait...done.
Checking for stray cats under /usr/share/man/nl...
Checking for stray cats under /var/cache/man/nl...
Processing manual pages under /usr/share/man/pt...
Updating index cache for path `/usr/share/man/pt/man8'. Wait...done.
Checking for stray cats under /usr/share/man/pt...
Checking for stray cats under /var/cache/man/pt...
Processing manual pages under /usr/local/share/man...
Updating index cache for path `/usr/local/share/man/mann'. Wait...done.
Checking for stray cats under /usr/local/share/man...
Checking for stray cats under /var/cache/man/local...
124 man subdirectories contained newer manual pages.
7794 manual pages were added.
0 stray cats were added.

從上述輸出的更新過程中,有時候有些失敗訊息是因為有些檔案找不到因此更新失敗,那個錯誤訊息可以忽略,因為有可能真的沒有那個mandb檔案可以做更新,更新完之後,再執行一次man -k passwd指令,則會有下列正常的輸出結果了:

[rockylinux@workstation ~]$ man -k passwd
chgpasswd (8)        - update group passwords in batch mode
chpasswd (8)         - update passwords in batch mode
fgetpwent_r (3)      - get passwd file entry reentrantly
getpwent_r (3)       - get passwd file entry reentrantly
gpasswd (1)          - administer /etc/group and /etc/gshadow
grub2-mkpasswd-pbkdf2 (1) - Generate a PBKDF2 password hash.
lpasswd (1)          - Change group or user password
openssl-passwd (1ssl) - compute password hashes
pam_localuser (8)    - require users to be listed in /etc/passwd
passwd (1)           - update user's authentication tokens
passwd (5)           - password file
passwd2des (3)       - RFS password encryption
pwhistory_helper (8) - Helper binary that transfers password hashes from passwd or shadow to opasswd
saslpasswd2 (8)      - set a user's sasl password
smbpasswd (5)        - The Samba encrypted password file
sslpasswd (1ssl)     - compute password hashes
vncpasswd (1)        - change the VNC password

接下來使用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 alphabetically 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
              with -l, scale sizes by SIZE when printing them; e.g., '--block-size=M'; see SIZE format below
.....

從上面的說明頁面來看,ls [OPTION]... [FILE]...的說明如下:

  • []之中括號起來的選項,意思是在執行指令的時候可以帶或不帶選項,即可有可無的意思。
  • ...的意思是說,在執行指令的後,帶選項可以是重複的。

接著使用man ps2pdf指令來看ps2pdf指令的說明頁面,相關節錄的說明頁面如下:

PS2PDF(1)                                            Ghostscript                                            PS2PDF(1)

NAME
       ps2pdf - Convert PostScript to PDF using ghostscript
       ps2pdf12 - Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible) using ghostscript
       ps2pdf13 - Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible) using ghostscript
       ps2pdf14 - Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible) using ghostscript

SYNOPSIS
       ps2pdf  [options...] {input.[e]ps|-} [output.pdf|-]
       ps2pdf12  [options...] {input.[e]ps|-} [output.pdf|-]
       ps2pdf13  [options...] {input.[e]ps|-} [output.pdf|-]
       ps2pdf14  [options...] {input.[e]ps|-} [output.pdf|-]

DESCRIPTION
       The  ps2pdf  scripts  are work-alikes for nearly all the functionality (but not the user interface) of Adobe's
       Acrobat(TM) Distiller(TM) product: they convert PostScript files to Portable Document Format (PDF) files.

       If the output filename is not specified, the output is placed in a file of the same name with a '.pdf'  exten‐
       sion  in the current working directory. Either the input filename or the output filename can be '-' to request
       reading from stdin or writing to stdout, respectively, when used as a filter.

       The three scripts differ as follows:

       -      ps2pdf12 will always produce PDF 1.2 output (Acrobat 3-and-later compatible).

       -      ps2pdf13 will always produce PDF 1.3 output (Acrobat 4-and-later compatible).

       -      ps2pdf14 will always produce PDF 1.4 output (Acrobat 5-and-later compatible).

其中,ps2pdf [options...] {input.[e]ps|-} [output.pdf|-]指令意思是,{}意思是,這個選項一定要使用,{}中間必要選其中一個選項來使用,裡面的選項以|來隔開。

輸出說明頁面

平常在一般的情況下,都是使用man 要查詢的指令名稱這樣方式輸出指定要查詢的說明頁面進行查詢,若要將整個指令說明頁面輸出也是可以的,可以使用:man -t ls > ls.ps這樣的方式將ls指令說明手冊頁輸出成postscript檔案,若要讓影印機印出,則可以使用ps2pdf方式將前面輸出的postscript檔案輸出成PDF檔,相關使用指令的方式以及輸出後的執行結果如下:

[rockylinux@workstation ~]$ man -t ls > ls.ps
[rockylinux@workstation ~]$ file ls.ps
ls.ps: PostScript document text conforming DSC level 3.0
[rockylinux@workstation ~]$ ps2pdf ls.ps ls.pdf
[rockylinux@workstation ~]$ file ls.pdf
ls.pdf: PDF document, version 1.4

從上述來看,多了使用file這個指令來協助查看輸出的檔案格式資訊,可以看到的是,一開始先用man指令輸出ls說明手冊頁之postscript檔案,而再將ls.ps檔案輸出成ls.pdf之PDF檔,為什麼要用file檔案檢查輸出的格式,原因是用.隔開後面的附檔名在Linux作業系統中只是因為便於使用者作辨識,實際上在作業系統中檔名並沒有附檔名的概念,如果檔案名稱亂取的話,還是只能使用file指令來確認真正的檔案格式資訊是什麼,下面的例子可以很顯著的說明這件事:

[rockylinux@workstation ~]$ man -t ls > ls.txt
[rockylinux@workstation ~]$ file ls.txt
ls.txt: PostScript document text conforming DSC level 3.0

從上面這個例子來看,就可以證明Linux作業系統之世界中,附檔名並不能夠決定一個檔案格式的資訊,而是需要用file指令協助我們看真正的檔案資訊,便於識別檔案,通常都會用附檔名可以對應到真正的檔案格式。

課後練習

  • 打開VirtualBox並啟動workstation虛擬主機。
  • 在桌面環境打開終端機並透過man指令找到fdisk指令之說明頁面。
  • 假設知道su指令是在section 1,透過終端機輸入man指令並指定section來找到su指令說明頁面。
  • su指令說明頁面透過終端機使用man指令輸出成Postscript檔案並將輸出的檔案取名叫:su.ps
  • 將上述的su.ps檔案轉成PDF檔並將輸出的PDF檔案格式取名叫su.pdf

上一篇
第4章:檔案系統結構介紹
下一篇
第6章:基本操作文字檔案介紹
系列文
Rocky Linux 8:系統管理與維運實戰23

尚未有邦友留言

立即登入留言