我如何忽略Perl的shebang在Windows与Apache 2?

hec6srdp  于 2023-10-24  发布在  Perl
关注(0)|答案(8)|浏览(147)

我已经在我的Windows机器上设置了一个本地Perl Web环境。我正在使用的应用程序最初来自Linux服务器,因此源.pl文件的shebang看起来像这样:

#!/usr/bin/perl

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

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

d7v8vwbk

d7v8vwbk1#

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

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文档(我上面链接的)指出:
Registry-Strict是Apache 2.0中的新选项,它与Registry做的事情相同,但只使用子项Shell\ExecCGI\Command。* ExecCGI项不是一个常见的项。它必须在Windows注册表中手动配置,因此可以防止意外的程序调用您的系统 *(强调我的)。

nvbavucw

nvbavucw2#

没有可移植的shebang线。即使在相同的平台和体系结构上,也可能有人在不同的位置安装了perl。
诀窍是不要手工安装模块和脚本。当你把所有东西打包成发行版并使用模块工具链时,shebang行会自动修改为指向你用来安装所有东西的perl。你不应该考虑这些细节。:)

lokaqttq

lokaqttq3#

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

lsmd5eda

lsmd5eda4#

在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
ix0qys7i

ix0qys7i5#

1.安装 * 任何 * Windows Bash风格(如Cygwin,MSYS 2或GnuWin 32);
1.创建一个简单的重定向shell脚本:

exec "@"

1.创建注册表项:

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>"

(......等等。)
1.在您的httpd.conf文件中添加Jot:

ScriptInterpreterSource Registry

Apache现在可以根据你选择的Bash风格来解析Unix的shebangs。这比在注册表中硬编码解释器路径提供了更多的灵活性。

iswrvxsc

iswrvxsc6#

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

qlfbtfca

qlfbtfca7#

我手头没有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上工作,尽管我不知道他们是如何管理的。

c9x0cxw0

c9x0cxw08#

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

  • 本地主机{site-name}上的XAMPP(C:\xampp\htdocs{site-name})
  • 独立安装的草莓Perl(C:\Perl\perl\bin),因为Perl包含在XAMPP包是不满意的

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

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

是否可以将目录(在-I切换后)永久包含到@INC?
是的,你可以通过设置PERLLIB或PERL 5LIB环境变量来实现。这在从命令行运行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

相关问题