13

我已经在我的 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,那么显而易见的答案就是不使用它。

4

8 回答 8

15

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

 ScriptInterpreterSource Registry-Strict

到您的httpd.conf并设置 Windows 注册表项,如Apache 文档中所述。

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

Windows 注册表编辑器版本 5.00

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

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

Apache docs(我在上面链接到)状态:

Apache 2.0 中的新选项 Registry-Strict 与 Registry 做同样的事情,但只使用 subkey Shell\ExecCGI\Command钥匙不是普通钥匙ExecCGI它必须在 Windows 注册表中手动配置,从而防止系统上的意外程序调用。(强调我的)

于 2010-01-10T09:20:08.370 回答
4

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

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

于 2010-01-10T11:47:23.683 回答
3

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

于 2010-08-24T18:17:35.720 回答
1

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

于 2010-02-09T08:33:25.587 回答
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
于 2015-09-04T21:51:51.283 回答
1
  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 shebangs。这比在注册表中硬编码解释器路径提供了更多的灵活性。

于 2016-06-03T15:08:20.423 回答
0

我没有方便的 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应该可以。

编辑:不适用于linux;显然工作parrot,虽然我不明白他们是如何管理的。

于 2010-01-10T09:21:11.723 回答
0

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

这对我有用:

  • localhost\{site-name} 上的 XAMPP (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
于 2020-03-20T10:41:43.177 回答