最終更新:2003-12-01
今津英世
CygwinからActivePerlを使ってPerlプログラムを実行する場合に以下の点が問題になる。たとえばCygwin上の/usr/local/bin/test.plにPerlプログラムが置かれているとしよう。そして、PATHには/usr/local/binが入っている。この場合、test.plを起動すると以下のようになってしまう。
$ test.pl
Can't open perl script "/usr/local/bin/test.pl": No such file or directory
こうなる理由は、ActivePerlはCygwinを使っていないにもかかわらず、Cygwinの中で動いているシェルがCygwinの中でだけ有効なパス/usr/local/bin/test.plをActivePerlに渡しているからである。
この様子を詳しく説明すると以下のようになる。
「test.pl」というコマンド行を受け取ったシェルはPATHの中のディレクトリーを順に調べてtest.plがどこにあるかを探す。その結果、シェルは/usr/local/bin/test.plがtest.plの絶対パスだと判断する。
UNIX上であれば、Perlプログラムやシェルスクリプトの1行目はOSのカーネルが解釈するので、シェルは単純に/usr/local/bin/test.plを起動すればいいのだが、Cygwin上では違う。シェルが/usr/local/bin/test.plの1行目の「#!perl」を読んでPerlインタープリターを使うべきことを知る。
次にシェルはperlがどこにあるかをPATHの中のディレクトリを順に探し、たとえば/cygdrive/c/Perl/bin/perlにあるとシェルが判断する。
そこでシェルは/cygdrive/c/Perl/bin/perlを起動し、その際にtest.plの絶対パス、/usr/local/bin/test.plを渡す。
ActivePerlはCygwinのことは知らないので/usr/local/bin/test.plをWindows上での\usr\local\bin\test.plと解釈して読み込もうとするができない。その結果 先に示したエラーメッセージを出力して終了してしまう。Cygwin上での/usr/local/bin/test.plはWindows上ではたとえばc:\cygwin\usr\local\bin\test.plであり、ActivePerlに対してはこのパスを渡すべきである。ActivePerlは/を\と読み換えることはするので最低でも/cygwin/usr/local/bin/test.plを渡さなければならない。
完全ではないが以下を行えばこの問題を回避できる。
Windows上にディレクトリーc:\usr\localを作成する。Cygwin上での操作は以下のとおりである。
$ mkdir /cygdrive/c/usr
$ mkdir /cygdrive/c/usr/local
Cygwinをインストールしただけの状態では/usr/localの下のbin・etc・libの各ディレクトリは空だが、現時点で何か入っていれば、/usr/localの内容を/cygdrive/c/usr/localにコピーする。bin・etc・libともに現時点で空ならば、それらのディレクトリーを/cygdrive/c/usr/localに作っておく。
こうしたうえで以下をCygwin上で実行する。これでc:\usr\localがCygwin上で/usr/localに見えるようになる。mountの状態はレジストリーに記録されるので、この操作は一度だけ行えばよい。
$ mount c:\\usr\\local /usr/local
このような操作をしたうえで/usr/local/binにPerlのプログラムを置けば、カレント・ドライブがCドライブである限り先に挙げた問題は発生しない。