【问题标题】:Bash: cannot execute a perl script using an absolute path?Bash:不能使用绝对路径执行 perl 脚本?
【发布时间】:2014-06-20 01:17:20
【问题描述】:

问题:我无法使用绝对路径运行 perl 脚本。我可以用相同的路径列出它,但只能在使用相对路径时执行!

我的 Cygwin 终端的输出会让这个问题很明显

在这里我尝试使用绝对路径执行脚本 - 它失败了:

LPI@Reboot /cygdrive/c/Users
$ /cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl
Can't open perl script "/cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl": No such file or directory

在这里我使用相同的绝对路径列出它 - 它有效,文件在那里:

LPI@Reboot /cygdrive/c/Users
$ ls /cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl
/cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl

在这里,我尝试使用相对于我当前目录 /cygdrive/c/Users 的路径执行它:

LPI@Reboot /cygdrive/c/Users
$ LPI/3DSiteSoftware/Code/Scripts/path_name.pl
USAGE: LPI/3DSiteSoftware/Code/Scripts/path_name.pl -p|-n <string>

有谁知道为什么第一个示例不起作用?我快被难住了! 感谢您的建议。

【问题讨论】:

  • ls -l /cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl 返回什么?
  • head -n 1 LPI/3DSiteSoftware/Code/Scripts/path_name.pl 的输出是什么?

标签: perl bash


【解决方案1】:

我猜你正在使用对/cygdrive/ 路径一无所知的非 Cygwin 版本的 Perl(如 Strawberry Perl 或 ActivePerl)。您可以通过运行perl -v 来确认这一点。如果它显示built for MSWin32,那么它不是 Cygwin Perl。

所以当你运行时

/cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl

Bash 运行

perl.exe /cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl

但是 Perl 会寻找

C:/cygdrive/c/Users/LPI/3DSiteSoftware/Code/Scripts/path_name.pl

没有找到。

当你跑步时

LPI/3DSiteSoftware/Code/Scripts/path_name.pl

Bash 运行

perl.exe LPI/3DSiteSoftware/Code/Scripts/path_name.pl

Perl 将它与您当前的 C:\Users 目录结合起来,并得到

C:\Users\LPI/3DSiteSoftware/Code/Scripts/path_name.pl

(Perl 不关心 Windows 上的混合斜杠)。

最简单的解决方案可能只是安装 Cygwin 的 Perl 版本,它将理解 Cygwin 路径。或者您可以编写某种 shim perl,将脚本名称转换为 Windows 路径并调用真正的 perl.exe

另一种可能是使用NTFS symbolic links 在每个卷上创建/cygdrive 目录(即,创建一个C:\cygdrive 目录,并使C:\cygdrive\c 成为C:\C:\cygdrive\d 的符号链接符号链接到D:\ 等)。但是当您调用 Perl 脚本时,您必须在任何可能是最新的驱动器上执行此操作。

【讨论】:

  • 其他选项:perl "$( cygpath --dos /cygdrive/.../path_name.pl )"
  • 安装 cygwin 的 Perl(如果还没有的话)是不够的。这也是调整shebang的问题。
  • 是的,我正在使用 ActivePerl - 我会尝试切换 - 谢谢!
猜你喜欢
  • 2018-02-25
  • 2023-03-13
  • 1970-01-01
  • 2013-06-26
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2016-08-12
相关资源
最近更新 更多