FreeBSD に於ける/etc と /usr/local/etc

総論

FreeBSDに於ては、OS、特にユーザーランドのコマンドの設定ファイルは /etc  に置かれることが多いです。他は各ユーザーのホームディレ クトリに置かれます。カーネル関係の設定ファイルは/boot に も置かれます。アプリケーションのうちports/pakcagesから 導入されたものの設定ファイルは、/usr/local/etc  に置かれ ることが多いです。他は各ユーザーのホームディレクトリに置かれること が多いです。

FreeBSDには、アプリケーション関係のファイルは、 /usr/local  より上のディレクトリ階層に出さないと言う思想 があるので、/usr/local/etc   が重視されます。Linuxでは、 アプリケーションはあまり /usr/local   以下に置かれませんし、 /usr/local/etcは、あまり活用されていません。 FreeBSDでは、設定ファイルのパスが2つに分散している性質 を生かして、巧妙な設定をすることができます。nviの例で説明 しましょう。

nviの例

この項で扱うFreeBSDの環境は、 FreeBSD/i386   6.2-RELEASE-p12 です。

FreeBSDのユーザランドのviは、nviのハードリンクです

foo@bar~% which vi
/usr/bin/vi


foo@bar~% cd /usr/bin
foo@bar/usr/bin% ls -FailG ./vi
1013929 -r-xr-xr-x 6 root wheel 281372 4 19 05:13 ./vi*
foo@bar/usr/bin% ls -FailG .    | grep 1013929
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 ex*
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 nex*
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 nvi*
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 nview*
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 vi*
1013929 -r-xr-xr-x     6 root wheel     281372     4 19 05:13 view*

スクリーンエディタviとラインエディタexとスクリーンエディタ のリードオンリーモードviewとがハードリンクの関係であることは 良く知られています。FreeBSDでは実は、nvi、nex、nviewがそれ に加わるのです。リンクカウントが6ですから、これ以外にハードリンク はないことになります。

foo@bar~% jman vi とすると、

このマニュアルは ex/vi テキストエディタから派生 したnex/nvi 用として提供されています。 nex/nvi は Fourth Berkeley Software Distribution (4BSD)オリジナルの exvi のバグひとつひと つの互換性も含めて置き換えたつもりです。

とあります。BSD系UNIXのviは、4.4BSDの頃からnviがその実体のよう です。オリジナルのコードを書いたのは、Keith Bostic氏です。

/usr/src/contrib/nvi/LICENSEに

* Copyright (c) 1991, 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
* Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
* Keith Bostic. All rights reserved.

とあります。

一方、FreeBSD Ports Collectionにある

nvi-m17n-1.79.20040401,1
A clone of vi/ex, with multilingual patch, no default settings

は、Keith Bostic氏が書いたコードに、萩野純一郎氏が 2バイト対応パッチを当てたもので、日本語の他、中国語、 韓国語が表示できます。萩野純一郎氏は、 Jun-ichiro itojun Hagino (Jun-ichiro Itoh) として知られた方です。

/usr/local/share/vi/README.japanese

を読むと、 ~/.exrc に

set showmatch
set showmode
set skipdisplay
set displayencoding=euc-jp
set inputencoding=euc-jp
set fileencoding=euc-jp
set autodetect=jp
set autodetect=jp+

と書けば良いことが判るので、~/.nexrcにそう書くと

foo@bar~% /usr/bin/vi
/home/foo/.nexrc, 6: set: no skipdisplay option: 'set all' gives all option values
/home/foo/.nexrc, 6: Ex command failed: pending commands discarded           

Press Enter to continue:                                                                              

と、viを起動する度にエラー=メッセージが表示されて煩わしいことに なります。

そこで、~/.nexrc は、

set exrc
set showmatch
set showmode

とシンプルにしておき、

/etc/vi.exrc を

set exrc
set showmatch
set showmode

/usr/local/etc/vi.exrc を

set exrc
set showmatch
set showmode
set skipdisplay
set displayencoding=euc-jp
set inputencoding=euc-jp
set fileencoding=euc-jp
set autodetect=jp
set autodetect=jp+

とすると、

foo@bar~% /usr/bin/vi

~
~
~
~
~
~
~
~
~
~
~
~
~
/tmp/vi.khQQ2CMrNE: new file: line 1

foo@bar~% /usr/local/bin/nvi

~
~
~
~
~
~
~
~
~
~
~
~
/tmp/vi.JIT5HF: new file, euc-jp: line 1

となり、エラー=メッセージが表示されなくなります。

つまり、

/usr/bin/vi は、 /etc/vi.exrc
/usr/local/bin/nvi は、 /usr/local/etc/vi.exrc

を設定ファイルとして読み込む訳です。

もちろん、両者とも、~/.nexrc があれば、それを最優先で 読み込みます。

/usr/local/bin/nvi の設定ファイルが
/usr/local/etc/vi.exrc であることは、

/usr/ports/editors/nvi-m17n/Makefile に

CONFIGURE_ENV= OPTFLAG='-D_PATH_SYSEXRC=\"${PREFIX}/etc/vi.exrc\"'

とあることから判ります。

まとめ

FreeBSDでは、OS、特にユーザランドの設定ファイルは、
/etc
アプリケーションの設定ファイルは、
/usr/local/etc
に置かれます。
nviのように、ユーザランド版とアプリケーション版と 両方存在するものでは、 ユーザーランドの設定ファイルは
/etc
に置き、
アプリケーションの設定ファイルは
/usr/local/etc
に置けば、2種類の設定ファイルを使い分けることが できます。