繁体   English   中英

如何使用 Apache 2 在 Windows 上忽略 Perl shebang?

[英]How do I ignore the Perl shebang on Windows with Apache 2?

我已经在我的 Windows 机器上设置了本地 Perl Web 环境。 我正在处理的应用程序最初来自 Linux 服务器,因此源.pl文件的 shebang 如下所示:

#!/usr/bin/perl

这会在我的 Windows 开发机器上导致以下错误:

(OS 2)The system cannot find the file specified.

是否可以更改我的 Apache 2 conf 以便在我的 Windows 机器上忽略shebang? 当然,我可以将 shebang 设置为#!c:\\perl\\bin\\perl.exe ,这很明显; 但问题在于部署更新的文件。 显然,在每次部署时将其改回是非常不方便的。 我在 Windows 7 上使用ActivePerl

更新:

我应该提到我需要保留shebang,以便脚本可以在我们的共享托管Linux生产服务器上运行。 如果我没有这个约束并且我不必使用shebang,那么显而易见的答案就是不使用它。

我在脚本中使用#!/usr/bin/perl并在 Windows 上配置 Apache 以忽略 shebang 行。 添加

 ScriptInterpreterSource Registry-Strict

到您的httpd.conf并按照Apache 文档中的说明设置 Windows 注册表项。

这是我导出密钥时得到的:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command]
@="c:\\opt\\perl\\bin\\perl.exe"

我一直在我的 Windows 笔记本电脑上的 Apache 和 ActiveState Perl 以及我的服务器上的 ArchLinux 附带的 Apache 和 Perl 发行版中使用此设置。

Apache 文档(我在上面链接到的)状态:

Apache 2.0 中新增的选项 Registry-Strict 与 Registry 执行相同的操作,但仅使用子项Shell\\ExecCGI\\Command ExecCGI密钥并不常见。 它必须在 Windows 注册表中手动配置,从而防止系统上的意外程序调用 (强调我的)

没有便携式shebang线。 即使在相同的平台和体系结构上,也可能有人在不同的位置安装了 perl。

诀窍是不要手动安装模块和脚本。 当您将所有内容打包为发行版并使用模块工具链时,shebang 行会自动修改为指向您用于安装所有内容的 perl。 你不应该考虑这些细节。 :)

我用 # ! /usr/bin/env perl ! /usr/bin/env perl作为我所有! /usr/bin/env perl上的 shebang,无论是在 *nix 还是 Windows 上。 Windows 只是忽略它,Unixen 跟随 env 到所选的 perl disto。

我进行这项工作的方式是将 perl.exe 复制到 c:/usr/bin/ 并将其重命名为 perl(剥离 .exe)

在 win7 及更高版本中,您也可以使用“dos”命令 mklink 执行此操作。

以管理员身份启动 cmd shell 并执行以下操作:

mklink /d c:\usr c:\Perl       # Activestate perl in c:\Perl\bin\perl.exe
mklink /d c:\usr c:\xampp\perl # Xampp perl in c:\xampp\perl\bin\perl.exe
  1. 安装任何Windows Bash 风格(例如 Cygwin、MSYS2 或 GnuWin32);
  2. 创建一个简单的重定向 shell 脚本:

     exec "@"
  3. 创建一个注册表项:

     Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\.cgi\\Shell\\ExecCGI\\Command] @="<path-to-sh> <path-to-script>" [HKEY_CLASSES_ROOT\\.pl\\Shell\\ExecCGI\\Command] @="<path-to-sh> <path-to-script>" [HKEY_CLASSES_ROOT\\.py\\Shell\\ExecCGI\\Command] @="<path-to-sh> <path-to-script>"

    (...等等。)

  4. 在您的httpd.conf文件中记录:

     ScriptInterpreterSource Registry

Apache 现在将根据您选择的 Bash 风格给出的解释来解析 Unix shebang。 这比在注册表中硬编码解释器路径提供更大的灵活性。

我手头没有 Windows,但 perlcritic 说:

my $desc = q{Found platform-specific perl shebang line};
my $expl = q{Perl source in parrot should use the platform-independent shebang line: #! perl};

所以,我猜#! perl #! perl应该可以工作。

编辑:在 linux 上不起作用; 显然适用于parrot ,尽管我不知道他们是如何管理的。

在 Windows 10 中的本地主机上使用 {site-name} 运行基于 Perl 的网站时,如何使用 Linux shebang (#!/usr/bin/perl)?

这对我有用:

  • XAMPP 在 localhost\\{site-name} (C:\\xampp\\htdocs\\{site-name})
  • 独立安装 Strawberry Perl (C:\\Perl\\perl\\bin) 因为 XAMPP 包中包含的 Perl 不令人满意

在默认配置中,您必须使用此shebang:

#!C:\perl\perl\bin\perl.exe -IC:\xampp\htdocs\{site-name}

是否可以将目录(在 -I 切换后)永久包含到@INC?

是的,您可以通过设置 PERLLIB 或 PERL5LIB 环境变量来实现。 这在从命令行运行 perl 脚本时有效,但令人惊讶的是它被 XAMPP 中的 apache 服务器忽略。 但是,@INC 目录之一 (C:/Perl/perl/site/lib) 通常是空的,因此您可以创建指向网站目录的符号链接:

mklink /D c:\perl\perl\site\lib C:\xampp\htdocs\{site-name}

现在,你可以使用这个shebang:

#!C:\perl\perl\bin\perl.exe

此外,您可以创建目录 c:\\usr\\bin

md c:\usr\bin

并从 C:\\perl\\perl\\bin\\ 复制 perl.exe

copy C:\perl\perl\bin\perl.exe c:\usr\bin\perl.exe

(由于某些原因,另一个 mklink 技巧在这里不起作用。)

最后,您可以在 Windows 上使用 Unix 风格的 shebang:

#!/usr/bin/perl

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM