現在のディレクトリとは異なるディレクトリから実行した場合に Perl スクリプトが見つからない

現在のディレクトリとは異なるディレクトリから実行した場合に Perl スクリプトが見つからない

UWIN がインストールされた Windows 10 で perl64 を使用しています。

私は Perl スクリプト sv2jb.pl を作成しました。これは、名前を入力するだけで ksh で呼び出され、現在のディレクトリにあるときに正常に実行されます。

次に、ホーム ディレクトリに「scripts」というサブディレクトリを作成し、そのスクリプトをそこに移動し、そのフル パスを ksh の $PATH 環境に追加しました。これで、このスクリプトがあるディレクトリ以外のディレクトリから sv2jb.pl を呼び出すと (スクリプト名を入力するだけで)、次のメッセージが返されます。

$ sv2jb.pl
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl" : No such file or directory

しかし、まさにそのファイルはここにあります...

ホームディレクトリ(スクリプトディレクトリがあるディレクトリ)から次のように呼び出すと、次のようになります。

$ scripts/sv2jb.pl

問題なく動作します...

また、そのディレクトリに cd して sv2jb.pl を呼び出すと、

$ cd scripts
$ sv2jb.pl

正常に動作します。

何が間違っているのか理解できません。

  1. スクリプト自体は、ディレクトリから呼び出されると実行されるので問題ありません。参考までに、最初の行は次のとおりです: #!//c/perl64/bin/perl.exe
  2. エラー メッセージには、ksh がファイルを見つけたこと (見つからないと言っているものの) が示されているため、$PATH 変数は正常です。

答え1

UWIN についてはよく知りませんが、Windows 上で実行するためのライブラリ レイヤーを提供するという点で、cygwin に似ていると思います。

スクリプトを呼び出すと、スクリプトは PATH 内で見つかり、プログラム ローダーによって開かれ、#! 行が調べられ、実行可能バイナリが見つかり、exec() が実行され、スクリプト名が最初の引数として渡されます。

問題は、バイナリが Windows アプリケーションである ActiveState perl と一致していることです。

スクリプトが現在のディレクトリにある場合、perl はスクリプト名を相対プログラム ( など) として渡して実行されるのではないかと思いますperl sv2jb.jpl。ただし、スクリプトが他の場所にある場合は、完全なパス名 ( など) が指定されますperl //C/users/me/desktop/scripts/sv2jb.pl

しかし、Windows バイナリは渡されるパスを理解しません。Windows コマンド プロンプトから直接呼び出すと、このことがわかります。次のような結果になるはずです。

C:\Perl64\bin>perl //C/users/me/desktop/scripts/sv2jb.pl  # what is running
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl

C:\Perl64\bin>perl C:/users/me/desktop/scripts/sv2jb.pl   # Changed to windows-style filepath
[...program runs....]

cygwin/Win10 と ActiveState Perl でも同じ動作を再現できます。

基本的に、Windows バイナリを Unix スクリプトの実行可能ファイルとして設定すると、奇妙な問題が発生します。Cygwin の場合は、Windows のパッケージではなく、Perl パッケージを使用することをお勧めします。UWIN でこれが可能な解決策かどうかはわかりません。

それ以外の場合は、Windows Perl を呼び出すことができますが、スクリプトに Windows スタイルのパスを明示的に渡す必要があります。

関連情報