我已经在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,那么显而易见的答案就是不使用它。
我在脚本中使用#!/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\Command
。ExecCGI
键不是常见的键。必须在Windows注册表中手动配置它,因此可以防止在系统上意外调用程序。 (强调我的)
[没有便携式shebang线。即使在相同的平台和体系结构上,也可能有人在不同的位置安装了perl。
诀窍是不要手动安装模块和脚本。当您将所有内容打包为发行版并使用模块工具链时,shebang行会自动修改为指向您用于安装所有内容的perl。您不必考虑这些细节。 :)
我使用#! /usr/bin/env perl
作为我所有perl的工具,无论是在* 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
我没有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
中使用,尽管我看不出他们是如何处理的。
创建简单的重定向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。与在注册表中对解释程序路径进行硬编码相比,这提供了更多的灵活性。