linux的man命令深入分析

來源:互聯網
上載者:User

man有如下8個模組.

1 shell中使用者可用的命令
2 使用函數庫中程式可用的系統調用
3 程式中可用的庫函數
4 /dev目錄中可用的裝置
5 多種雜項系統檔案(ex:/etc/)
6 如果有的話,遊戲程式
7 雜項資訊
8 管理員可用的命令

1)man命令是如何搜尋命令對映的協助檔案的?
2)協助檔案的檔案格式和結構是怎麼的?
3)如何建立一個man的協助檔案?
4)whatis和apropos的運行流程是如何的呢?

第一個問題:
man命令搜尋流程
第一步:$PATH變數指定的路徑
第二步:/etc/man.config檔案中MANPATH中指定的路徑

程式執行流程:
1)程式首先會試圖載入/etc/man.config檔案,將man.config的內容讀入記憶體,
2)將man.config檔案中"MANSECT         1:8:2:3:4:5:6:7:9:tcl:n:l:p:o"讀入到記憶體
MANSECT是man尋找的順序,例如上面的這個順序就是如果查到shell命令和系統調用,將優先列印shell命令
3)通過man.config和$PATH,確定出要搜尋的目錄
4)通過fstat系統調用,確認存在的目錄.
5)確定尋找到的命令/函數所對映的模組,例如sync命令的順序是1:8:2,可以通過man -a sync來確認
6)根據對映的模組找到對映man協助檔案,這裡通過open開啟第4步中存在的目錄,依次尋找對映的協助檔案(順序見man命令的搜尋流程)

說明:
1)在第一步載入man.config的過程中,如何沒有找到/etc/man.config檔案.程式將繼續運行,並只根據$PATH來搜尋協助檔案
2)在man.config中可以加入自訂的搜尋目錄,man程式會判斷搜尋目錄中是否存在man目錄和MAN目錄.
例如:定義了/tmp目錄,man程式會搜尋/tmp/man和/tmp/MAN還有/tmp三個目錄.
3)man.config中定義了壓縮與解壓縮的方式,但如果man.config不可讀,man程式依然可以解壓以gzip壓縮的協助檔案.
如果以其它壓縮格式,man程式將無法解壓.例如用bunzip2壓縮的協助檔案.
4)用manpath命令可以看到man.config中MANPATH指定的路徑.但這不包括變數PATH中指定的路徑.

第二個問題:
man程式讀取的協助檔案格式分為兩大類.
第一類為troff程式編寫的來源程式.
第二類為通過壓縮公用程式壓縮過的來源程式.

man程式可以直接讀取的格式,是第一大類,和第二大類中用gzip壓縮的協助檔案.
其它格式要用man.config中定義的解壓縮工具處理,才可以閱覽.
例如:
.gz             /bin/gunzip -c
.bz2            /usr/bin/bzip2 -c -d
.z
.Z              /bin/zcat
.F
.Y
這裡說明,.gz格式的用gunzip -c來直接讀取,而.bz2用bzip2 -c -d來讀取,.Z用/bin/zcat來讀取

協助檔案預設的路徑為/usr/share/man和/usr/local/man/
其中/usr/share/man存放了絕大多數的協助檔案,而且都是壓縮格式的協助檔案.
/usr/local/man存放的都是以文字格式設定的協助檔案.

/usr/share/man中的子目錄是對映的模組.例如man1目錄中存放的協助檔案是“shell中使用者可用的命令”
而檔案名稱,是命令名/函數名加上模組的序號,如果是壓縮格式,再加入壓縮的副檔名即可.
例如:
host.1.gz即是程式名(host).模組的序號(1).副檔名(gz)

第三個問題:
例如,自己寫一個測試程式hello.c
如下:

#include <stdio.h>
int main()
{
printf ("Hello world,This is a test!\n");
return 0;};

編譯:
gcc -o hello hello.c

在/usr/share/man/建立一個 man檔案.
檔案名稱要講規範.本例為hello.1
檔案內容如下 :
.\" $Id: hello.1,v 1.11.2.2 2009/06/7 04:44:38 marka Exp $
.\"
.TH "Hello" "1" "Jun 7, 2009" "hacker" ""
.SH NAME
Hello \- This is a test.Display hello strings.
.SH SYNOPSIS
.sp
\fBhello\fR
.SH "DESCRIPTION"
.PP
\fBhello\fR
is a simple test for show man program.
\fBhello\fR
prints a short test message.
.PP
print follow as:
Hello world.This is a test.
.SH "FILES"
.PP
\fBhello\fR
.SH "SEE ALSO"
.PP
\fBprintf\fR(1),
\fBstdio.h\fR(8).

這樣即就可以為hello程式建立man檔案了.當然你沒有hello的可執行程式也是可以運行man hello的.

現在可以用man -aw hello來查看hello命令的man檔案了.

第四個問題:
whatis的運行流程如下:
1)搜尋/var/cache/man/whatis檔案.
/var/cache/man/whatis是文字檔.
2)如果/var/cache/man/whatis不存在. 到man.config中MANPATH指定的路徑到搜尋whatis檔案

說明:
1)與man命令搜尋不同之處在於,man命令會首先搜尋PATH變數指定的路徑.
2)如果找到兩個whatis檔案,將顯示兩遍相同的命令.
例如:
whatis ls
ls                   (1)  - list directory contents
ls                   (1)  - list directory contents
3)建立一個man檔案,例如上面的hello.1,這時用whatis是找不出對映資訊的,因為還沒有同步到/var/cache/man/whatis檔案中.
如果要同步,可以直接用makewhatis -u -w更新whatis檔案.
4)在/etc/cron.daily目錄下有個makewhatis.cron指令碼,它的任務就是每天更新whatis檔案的.

apropos的運行流程與whatis一樣.但apropos是藉助whatis檔案進行全文檢索搜尋.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.