我在安装了 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
- $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 样式路径传递给脚本。