从与当前目录不同的目录执行时找不到 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. $PATH 变量没问题,因为错误消息显示 ksh 找到了该文件(虽然说找不到它)。

答案1

不熟悉 UWIN,但我假设它与 cygwin 类似,因为它提供了一个在 Windows 之上运行的库层。

当您调用脚本时,它会在 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,我建议您使用 perl 包而不是 windows 包。我不知道这是否是 UWIN 的可能解决方案。

否则,您可以调用 windows perl,但必须显式地将 windows 样式路径传递给脚本。

相关内容