現在のディレクトリ以外のディレクトリで実行しているときにPerlスクリプトが見つかりません。

現在のディレクトリ以外のディレクトリで実行しているときにPerlスクリプトが見つかりません。

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

私は名前を入力してkshから呼び出すときと現在のディレクトリにあるときによく実行されるPerlスクリプトsv2jb.plを作成しました。

その後、ホームディレクトリに "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

良い結果...

また、ディレクトリに移動してsv2jb.plを呼び出すと、次のようになります。

$ cd scripts
$ sv2jb.pl

正しく実行されます。

何が間違っているのかわかりません。

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

ベストアンサー1

UWINには慣れていませんが、Windows上で実行されるライブラリ階層を提供するという点で、cygwinに似ているとします。

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

問題は、このバイナリがActiveState Perl(Windowsアプリケーション)と一致することです。

私は、スクリプトが現在のディレクトリにあるときに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スタイルのパスをスクリプトに明示的に渡す必要があります。

おすすめ記事