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

问题描述 投票:11回答:8

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

#!/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,那么显而易见的答案就是不使用它。

windows perl apache2 activeperl shebang
8个回答
12
投票

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

 ScriptInterpreterSource Registry-Strict

httpd.conf,然后按照Apache docs中的说明设置Windows注册表项。

这是导出密钥后得到的:

Windows注册表编辑器版本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\CommandExecCGI键不是常见的键。必须在Windows注册表中手动配置它,因此可以防止在系统上意外调用程序。 (强调我的)


4
投票

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

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


3
投票

我使用#! /usr/bin/env perl作为我所有perl的工具,无论是在* nix还是Windows上。 Windows只会忽略它,而Unixen会跟随env进入所选的perl disto。


1
投票

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


1
投票

在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

0
投票

我没有Windows手提电脑,但言语刻薄:

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应该起作用。

编辑:在linux上不起作用;显然可以在parrot中使用,尽管我看不出他们是如何处理的。


0
投票
  1. 安装any 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。与在注册表中对解释程序路径进行硬编码相比,这提供了更多的灵活性。


0
投票
[在Windows 10的本地主机上使用{site-name}运行基于Perl的网站时如何使用Linux shebang(#!/ usr / bin / perl)?
© www.soinside.com 2019 - 2024. All rights reserved.