Cygwin上でActivePerlのプログラムを起動するための工夫

最終更新:2003-12-01

今津英世

 

 CygwinからActivePerlを使ってPerlプログラムを実行する場合に以下の点が問題になる。たとえばCygwin上の/usr/local/bin/test.plPerlプログラムが置かれているとしよう。そして、PATHには/usr/local/binが入っている。この場合、test.plを起動すると以下のようになってしまう。

$ test.pl

Can't open perl script "/usr/local/bin/test.pl": No such file or directory

こうなる理由は、ActivePerlCygwinを使っていないにもかかわらず、Cygwinの中で動いているシェルがCygwinの中でだけ有効なパス/usr/local/bin/test.plActivePerlに渡しているからである。

 この様子を詳しく説明すると以下のようになる。

  1. test.pl」というコマンド行を受け取ったシェルはPATHの中のディレクトリーを順に調べてtest.plがどこにあるかを探す。その結果、シェルは/usr/local/bin/test.pltest.plの絶対パスだと判断する。

  2. UNIX上であれば、Perlプログラムやシェルスクリプトの1行目はOSのカーネルが解釈するので、シェルは単純に/usr/local/bin/test.plを起動すればいいのだが、Cygwin上では違う。シェルが/usr/local/bin/test.plの1行目の「#!perl」を読んでPerlインタープリターを使うべきことを知る。

  3. 次にシェルはperlがどこにあるかをPATHの中のディレクトリを順に探し、たとえば/cygdrive/c/Perl/bin/perlにあるとシェルが判断する。

  4. そこでシェルは/cygdrive/c/Perl/bin/perlを起動し、その際にtest.plの絶対パス、/usr/local/bin/test.plを渡す。

  5. 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を渡さなければならない。

 完全ではないが以下を行えばこの問題を回避できる。

  1. Windows上にディレクトリーc:\usr\localを作成する。Cygwin上での操作は以下のとおりである。

    $ mkdir /cygdrive/c/usr

    $ mkdir /cygdrive/c/usr/local

  2. Cygwinをインストールしただけの状態では/usr/localの下のbin・etc・libの各ディレクトリは空だが、現時点で何か入っていれば、/usr/localの内容を/cygdrive/c/usr/localにコピーする。bin・etc・libともに現時点で空ならば、それらのディレクトリーを/cygdrive/c/usr/localに作っておく。

  3. こうしたうえで以下をCygwin上で実行する。これでc:\usr\localがCygwin上で/usr/localに見えるようになる。mountの状態はレジストリーに記録されるので、この操作は一度だけ行えばよい。

    $ mount c:\\usr\\local /usr/local

このような操作をしたうえで/usr/local/binPerlのプログラムを置けば、カレント・ドライブがCドライブである限り先に挙げた問題は発生しない。