[英]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
创建一个简单的重定向 shell 脚本:
exec "@"
创建一个注册表项:
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>"
(...等等。)
在您的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)?
这对我有用:
在默认配置中,您必须使用此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.