D. J. Bernstein [translated to Japanese by Yusuke Shinyama, 2002-09-06]
UNIX
/package の階層

ファイルをさがす

Filesystem Hierarchy Standard (FHS) 2.2 いわく: ``この標準によって、ソフトウエアはインストールされている ファイルやディレクトリの位置を予測できるようになり、 またユーザもインストールされている ファイルやディレクトリの位置を予測できるようになります。''

/package も同じことをやります。 そして、より信頼できるやり方でやります。 実際には、ソフトウエアやユーザは FHS では 信頼してファイルにアクセスすることができませんが、 /package ならできます。

たとえば: lynx の設定ファイルは /etc/lynx.cfg でしょうか、 それとも /usr/local/etc/lynx.cfg でしょうか? この答えは、lynx が ``system の'' パッケージか、あるいは ``local な'' パッケージかによって違ってしまいます。

反対に、 /package では ``local な'' パッケージが ``system に'' 統合されても 名前は変わりません。

別の例として: hylafax パッケージに含まれている統計プログラムは xferstats と呼ばれているでしょうか、 あるいは xferstat、それとも xferfaxstats? FHS のもとでは、ソフトウエアもユーザもその答えをいうことはできません。 オリジナルの xferstats という名前は wu-ftpd パッケージの 異なる統計プログラムによって使われているからです。 ある OS ディストリビュータは、この名前を xferstat に 変えることで衝突を回避しました。別の OS ディストリビュータは xferfaxstats に変えることで衝突を回避しました。

反対に、 /package における名前はグローバルに割り当てられます。 なので最初から衝突は起こりません。 これは /package の重要な特徴のひとつです。

これに対する選択肢

あるときこう書いた人がいました。 「ソフトウエアはどんなことがあっても、ファイルを取得するときの 名前を決めうちにしてはならない」 (彼は私が文脈を無視してこの引用を使っているというので、 ここでは彼が誰であるか言及はしません)

以下は私の皮肉に満ちた回答です:

     ええ、それはたいへん重要な原則ですね!

     たとえば csh を例にとってみましょう。これは /etc/csh.cshrc と /dev/log と
     /bin/sh とその他多くのファイルを使用します。これらが変更できるように、
     これらのファイル名はすべて /etc/csh.conf に記されています。

     さて、ある人が /etc/csh.conf それ自身を移動させたいとしましょう。
     このため、csh は /etc/csh.conf をさがすのに、ハッシュされた /etc/registry.db
     ファイルを使います。

     もちろん、いくつかのマシンでは、/etc/registry.db を移動させる
     必要があります。だからレジストリのファイル名が COMPILEDFREGISTRY 環境変数に
     入っているというわけです。

     COMPILEDFREGISTRY 環境変数が別のところで使われていて、
     これが衝突するという可能性もまだあります。だからこの変数の名前は
     /etc/fregistry_variable_name.txt に入っています。

     /etc/fregistry_variable_name.txt を移したいって? おバカさん!
     私たちはすでに何十億ものプログラムの main() 先頭で /etc/fregistry_variable_name.txt を
     読むようにさせてるんですよ。これ _以外_ ならあきらかに変更可能です。
     でも /etc/fregistry_variable_name.txt だけはどこへも移動させてはいけません。