マニュアルページのソースを理解する

使用方法の正確には理解できていないコマンドはmanコマンドにより、マニュアルを参照することになります。

今回は、そのマニュアルコマンドが参照する元ネタのファイルについて勉強しました。

lsコマンドのマニュアルファイルを例にとってみます。

まず、マニュアルは以下の9章に分けられて記述されています。

$ man man

1 実行プログラムまたはシェルのコマンド
2 システムコール (カーネルが提供する関数)
3 ライブラリコール (システムライブラリに含まれる関数)
4 スペシャルファイル (通常 /dev に置かれている)
5 ファイルのフォーマットとその約束事。例えば /etc/passwd など
6 ゲーム
7 マクロのパッケージとその約束事。例えば man(7), groff(7) など
8 システム管理用のコマンド (通常は root 専用)
9 カーネルルーチン [非標準]

lsは実行プログラムであり、シェルのコマンドであるので、第一章すなわちman1のディレクトリに置いてあることが予想されます。


manのパスは/etc/manpath.configというファイルに記述されています。
$ less /etc/manpath.config

# *PATH* -> *MANPATH*
#
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/man
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/man
MANPATH_MAP /usr/local/sbin /usr/local/share/man
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
MANPATH_MAP /usr/games /usr/share/man
MANPATH_MAP /opt/bin /opt/man


lsのパスは
$ which ls
/bin/ls
なので、/usr/share/manのディレクトリ下にあると考えられる。

$ cd /usr/share/man
$ cd man1
$ pwd
/usr/share/man/man1

lsとついているファイルを表示
$ ls | grep ls
alsactl.1.gz
alsamixer.1.gz
dpkg-gensymbols.1.gz
false.1.gz
fslsfonts.1.gz
hp-levels.1.gz
ls.1.gz
lsattr.1.gz
lsb_release.1.gz
lscpu.1.gz
lsdiff.1.gz
lshw.1.gz
lspgpot.1.gz
lss16toppm.1.gz
lsusb.1.gz
md5sum.textutils.1.gz
mtools.1.gz
mtoolstest.1.gz
mysqlshow.1.gz
mysqlslap.1.gz
ppmtolss16.1.gz
pulseaudio.1.gz
smbcacls.1.gz
system-tools-backends.1.gz
tclsh-default.1.gz
tclsh.1.gz
tclsh8.4.1.gz
tclsh8.5.1.gz
xlsatoms.1.gz
xlsclients.1.gz
xlsfonts.1.gz



ls.1.gzがおそらく、lsのマニュアルであろうと考えられるので、ホームディレクトリにコピーして展開
$ cp ls.1.gz ~
$ cd ~
$ gunzip ls.1.gz
$ ls | grep "ls"
ls.1
$ less ls.1
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.35.
.TH LS "1" "June 2010" "GNU coreutils 8.5" "User Commands"
.SH NAME
以下続く


マニュアルは、manコマンド固有の文法でかかれているようである。
makefileとこの点は類似しています。
ちょっと調べたところ、groffコマンドをフィルタにすれば可読な文に翻訳できることがわかった。

$ groff -Tascii -man ls.1 | less

]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).

続く・・・



結構シンプルな仕組みですね。

でしたら、以前自分で作ったhello(/bin/hello)プログラムに関してのオンラインマニュアルを作成して、/usr/share/man/man1/に置いてやれば、manコマンドの引数とすることができるはずです。

$ vim hello.1
$ ls hello.1
.TH HELLO 1
.SH NAME
HELLO \- A simple greeting application that only geets.

.SH AUTHOR
KAPPA

$ gzip hello.1
$ ls
hello.1.gz
#/usr/share/man/man1/へコピー
$ sudo hello.1.gz /usr/share/man/man1

#テストしてみます。
$ man hello

HELLO(1) HELLO(1)

NAME
HELLO - A simple greeting application that only geets.

AUTHOR
KAPPA

HELLO(1)

うまくいきました。


ソフトウェアをマニュアルも一緒に配布しようと考える場合は、今回の操作をMakefileに書き込んでおけばいいのかな?
Configureスクリプトでマニュアルのパスを調べるようにしておくのかな?

現段階の理解では、まだよく分かりません。