
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
正常に動作します。
何が間違っているのか理解できません。
- スクリプト自体は、ディレクトリから呼び出されると実行されるので問題ありません。参考までに、最初の行は次のとおりです: #!//c/perl64/bin/perl.exe
- エラー メッセージには、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 スタイルのパスを明示的に渡す必要があります。