Windows に UNIX 風の環境を作りだす Cygwin と MSYS。 どちらも便利なものだが、やはりそれなりの問題も抱えている。 簡単にこの二つの仕組みをまとめて特徴を知っておこう。
Cygwin のコアは cygwin.dll という DLL で、 そこで fork や open や read と言った API を提供しているわけだ。 その Cygwin DLL の重要な機能の一つにパスの変換がある。
違いと言えば「/」と「\」の違い、というのもあるのだが、 まあこれは一対一の置換なのでなんとかなる。 問題は「ドライブ」である。こんなものは UNIX にはないので プログラムの側も全く考慮していないし、ルートディレクトリの 扱いもややこしい。
そこで Cygwin ではどうしたかと言うと、 最初に「Cygwinのルートディレクトリ」を決めて (デフォルトでは C:\cygwin)、その中に独自の ファイルシステムを作ってしまう。 しかしそれではその外にアクセスできないので、 /cygdrive/c が C:、 /cygdrive/d が D: を表す、というように決めた。 これで全ファイルシステムにアクセスできるようになった。 この表現を「Cygwin パス」と呼んでおこう。 以下にいくつかパス変換の例を示す。
Cygwin パス | Windows ネイティブパス |
---|---|
/ | C:\cygwin |
/usr | C:\cygwin\usr |
/cygdrive/c | C:\ |
/cygdrive/d/usr | D:\usr |
おおまかに言って問題は二つある。
一つは、変換すること自体である。 あくまでパスを変換するのは Cygwin DLL で、しかも実行時である。 Cygwin DLL をリンクしていないプログラムは Windows パスが直に 見えているから、Cygwin のプログラムと連携するのが難しい。
もう一つは、サブディレクトリに見えるものが
実際は「上」にあることだ。
例えば /
から見て /cygdrive/c
は
下にあるのに、それは実は C:\
だから上にある。
これは UNIX ではシンボリックリンクを使わないと起こらないし、
そのときは区別ができる。Cygwin 環境ではできない。
MinGW も Cygwin と同じようにパスの変換をしている。 しかし fork だの exec だののエミュレーションはしない。 とにかく必要なものだけが動けばいいという立場だ。
MSYS パスの変換の方式は Cygwin とまた違う。
MSYS にもエミュレーションを行う DLL がある (msys.dll) のだが、
その DLL を置いたところが /bin
になる。
そして /bin
の一つ上のディレクトリが /
になる。
また、/bin
は /usr/bin
でもある。
/
は /usr
でもある。
とても気持ち悪い。
最後に、各ドライブは
/c
→ C:\
、
/d
→ D:\
というようにアクセスできる。
さらにこの他に (MSYSの) /etc/fstab
を
使って対応を指定する方法もある。フォーマットは中に
書いてあるので見てみてほしい。ただし MSYS シェルを
再起動しないと効果が出ない。
ちょっと小さかった……。
Copyright (c) 2002 Minero Aoki
<aamine@loveruby.net>