/ «2003-12-02 (Tue) ^ 2003-12-04 (Thu)» ?
   西田 亙の本:GNU 開発ツール -- hello.c から a.out が誕生するまで --

Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール


2003-12-03 (Wed)

[UNIX] man pages の正体を求めて・その1

man ファイルの謎

自分の無知を知ることは、他人の限界を知ることでもある。世の中には膨大な数の文書が出回っているけれど、ただのひとつとして完全なものは存在しない。この世に完全無欠な文書など存在する訳もなく、自分が本当に知りたい情報は、ほとんどの場合書かれていないものだ。まずは、この冷徹な事実を知ることが大切。そして、ひと度目標を定めたら、ゴールに辿り着くまで、決して諦めない執着心が二番目に大切。具体的に、man pages を例に取って、放浪の旅の一例をご紹介しよう。

How to find and write manual pages?

UNIX ユーザーであれば、誰もが必ずお世話になっている man pages。man ls で表示される、例のメッセージだが、このソースは一体どこに存在し、どういう文法で記述されているのだろうか?素朴にして単純なこの問いに対する答えは、そこら辺に転がっているように思える。Google で探せば、たちどころに見つかりそうな気がする。しかし、現実はそう甘くはないのである。

die.net

少々脱線するが、皆さんは man pages を印刷する際、どうしておられるだろうか?ポストスクリプトプリンター環境であれば、比較的満足行く出力が得られるが、フォントが一本調子で今ひとつだし、ブラウザー上で気軽に閲覧したいことも多い。そんな時、私は「die.net の Linux docs」のお世話になっている。オンライン版のドキュメントブラウザーはこの他にもいくつかあるが、デザインセンスが良いので、私はこのサイトが一番のお気に入り。Linux man pages は、検索機能もあり、お勧めである(以下、die.net から引用)。

man man

まず最初に誰もがトライするのは、man man だろう。しかし、man (1) を読んでみると分かるのだが、長い割には大したことは書かれていない。ソースの居場所に関しては、MANPATH 環境変数、/etc/man.conf 設定ファイル、/usr/share/man ディレクトリあたりが大事そうだ・・という事は分かるが、man pages のソースフォーマットに関する解説は、見当たらない。

しかし、ここでいじけてしまわないように。人間辛抱が肝心である。目指すブツが見つからずとも、ひょんなところでお宝が見つかったりするものだ。情報探索においては、転んでもタダでは起きない精神が肝要である。

man (1) 中でチェックすべき重要事項は、ふたつある。ひとつは、次の -w オプション。

      -w or --path
             Don’t actually display the man pages, but  do  print  the  loca-
             tion(s) of the files that would be formatted or displayed. If no
             argument is given: display (on stdout) the list  of  directories
             that  is  searched by man for man pages. If manpath is a link to
             man, then "manpath" is equivalent to "man --path".

man の中身を表示する代わりに、ソースファイルの居場所を表示するというオプションである。早速、確認してみよう。

$ man -w man
/usr/share/man/man1/man.1.gz

お〜〜〜、man (1) のソースは /usr/share/man/man1/man.1.gz だったのね。中身をチェックしておこう。

$ zcat /usr/share/man/man1/man.1.gz | head
.?"
.?" Generated automatically from man.1.in by the
.?" configure script.
.?"
.?" Man page for man (and the former manpath)
.?"
.?" Copyright (c) 1990, 1991, John W. Eaton.
.?"
.?" You may distribute under the terms of the GNU General Public
.?" License as specified in the README file that comes with the man 1.0

ウムウム、なかなか良い感じである。man ファイルの本体は、/usr/share/man ディレクトリ配下に、gzip 圧縮形式で格納されていることが分かった。

となると、次に重要な点は man ファイルの「検索順序」だ。この点については、man (1) 中の "SEARCH PATH FOR MANUAL PAGES" に4段階に及ぶパス決定過程が詳しく書かれているので、チェックしておこう。

で、本題に戻る。先ほど cat コマンドで覗いたファイルは、一体どのような文法で書かれているのだろうか?これが分からなければ、man ファイルは書けない。何としてでも、ここは突破せねば・・。

Formatting programs (roff, nroff, troff, groff)

man (1) 中の記述を注意深く読んでいくと、次のような表記に出会う。

      -p  string
             Specify the sequence of preprocessors to run before nroff or troff.

nroff, troff というプログラムがどうも臭い(どちらも UNIX 界ではよく耳にする言葉だ)。雰囲気的には、このふたつのプログラムが先ほどの呪文ファイルを、私達になじみ深い man pages に変換しているようだ。となると nroff/troff は man コマンドの心臓部とも言うべき存在だから、"SEE ALSO" に記述されているはず(SEE ALSO はチェックポイントのひとつ)。しかし、そこには groff という名前しかない。

nroff, troff, groff、すべて最後の4文字は roff。この3つのプログラムは、どうやら roff というご先祖様から派生しているようだが、一体どう違うのだろう?