我如何忽略Apache 2上的Windows shebang?

我在Windows机器上build立了一个本地的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 。

更新:

我应该提到我需要保留这个脚本,以便脚本可以在我们的共享宿主Linux生产服务器上运行。 如果我没有这个限制,而且我也不必使用shebang,那么明显的答案就是不使用它。

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

  ScriptInterpreterSource Registry-Strict 

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

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

 Windows注册表编辑器版本5.00

 [HKEY_CLASSES_ROOT \特等\壳牌\ ExecCGI \命令]
 @ = “C:\\ \\选择\\的perl斌\\ perl.exe所在”

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

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

在Apache 2.0中新增的选项Registry-Strict与注册表完全相同,但只使用子键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)

我没有Windows方便,但percerritic说:

 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作品,虽然我不明白他们如何管理。

在win7及以上,你也可以用“dos”命令mklink来做到这一点。

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

 mklink /dc:\usr c:\Perl # Activestate perl in c:\Perl\bin\perl.exe mklink /dc:\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现在将解析Unix shebang相对于你选择的Bash风格给出的解释。 这比注册表中的硬编码解释器路径提供更多的灵活性。