2013年2月5日火曜日

MANPATH環境変数の整理

PATH環境変数の記事を書いている時に、自分のMANPATHもあまり整理されていないことに気づいたので、それについても書きたいと思います。

MANPATHは、Unixコマンドや関数の使い方の説明マニュアルであるmanページを探すための環境変数です。manページはターミナル上でmanコマンドを使い見ることができます。
例えば、grepコマンドについて知りたいと思ったら、
$ man grep
と、ターミナル上のプロンプトから入力すれば、以下のような説明が出てきます。

GREP(1)                                                                GREP(1)

NAME
       grep, egrep, fgrep - print lines matching a pattern

SYNOPSIS
       grep [options] PATTERN [FILE...]
       grep [options] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
       Grep  searches the named input FILEs (or standard input if no files are
       named, or the file name - is given) for lines containing a match to the
       given PATTERN.  By default, grep prints the matching lines.

       In addition, two variant programs egrep and fgrep are available.  Egrep
       is the same as grep -E.  Fgrep is the same as grep -F.

OPTIONS

... 長いので以下省略します...

元に戻ってMANPATHについての話です。

MANPATHは、manコマンドがmanファイルを探す場所を指定します。基本的な考え方としては、PATH変数と同じように、特殊・ローカルなディレクトリを先に、標準のディレクトリを後に指定すればよいと思います。また、PATH変数で指定されるディレクトリには、対応するman ファイルのディレクトリがありますので、PATHに合わせて指定すればよいでしょう。
現在の私のMANPATHは以下のようになっています。実は、整理した結果こうなったのですが、整理前は、/usr/local/manなどが複数回現れたり後ろの方に来ていました。

/Users/karuku/local/man:/Users/karuku/local/share/man:/usr/local/share/man:/opt/local/man:/usr/share/man:/opt/X11/share/man:/usr/local/clamXav/share/man

それぞれ以下に説明します。

/Users/karuku/local/man - ~/local/{bin,sbin}に対応します
/Users/karuku/local/share/man - 同上。上のものと合わせる方がよいのかも
/usr/local/share/man - /usr/local/{bin,sbin}に対応します
/opt/local/man - MacPorts用のman。/opt/local/share/manへのリンク
/usr/share/man - /usr/{bin,sbin}, /{s}binに対応します
/opt/X11/share/man - /opt/X11/binに対応します
/usr/local/clamXav/share/man - ClamXav用のman

ところで、同じディレクトリで、…/manとなっていたり、…/share/manとなっていたり、両方ある場合があります。
私の理解では、以前は、.../manというように…/binディレクトリと同じ階層にmanディレクトリのみが作られていたと思います。それが、いつの頃からか…/share/manに変更されてきたようです。…/share/manを知らないコマンドのために…/manも残されていた、または、…/share/manへのシンボリックリンクになって併存した時代が続き、最近は、…/share/manに統一されてきているようです。
OS Xの場合は、システムディレクトリは、…/share/manになっているようですね。

また、PATHとMANPATHで少し違うところがあります。PATHはコマンドの実行用なので最初にPATHの中から見つかったコマンドがシェルによって実行されます。
でも、MANPATHの場合は、manコマンドでマニュアルを見るためのものなので同名のコマンドや関数が重なっても、最初に見つかったものではないものを見たい場合があります。
その場合は、以下のようにmanコマンドに -a オプションを付ければすべての同名のコマンドや関数のファイルを表示してくれます。

例えば、md5コマンドについて知りたい場合、
$ man -a md5
とすると、私の場合は、openssl dgstコマンドのサブコマンドのmd5, /sbin/md5, md5関数、Tclでサポートされているmd5などの説明が表示されます。

皆さんも、ときどきPATHやMANPATHその他の環境変数を確認されるとよいのではないでしょうか。

0 件のコメント:

コメントを投稿