[英]How do I ignore the Perl shebang on Windows with Apache 2?
我已經在我的 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,那么顯而易見的答案就是不使用它。
我在腳本中使用#!/usr/bin/perl
並在 Windows 上配置 Apache 以忽略 shebang 行。 添加
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 文檔(我在上面鏈接到的)狀態:
Apache 2.0 中新增的選項 Registry-Strict 與 Registry 執行相同的操作,但僅使用子項
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)
在 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
創建一個簡單的重定向 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。 這比在注冊表中硬編碼解釋器路徑提供了更大的靈活性。
我手頭沒有 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
#! perl
應該可以工作。
編輯:在 linux 上不起作用; 顯然適用於parrot
,盡管我不知道他們是如何管理的。
在 Windows 10 中的本地主機上使用 {site-name} 運行基於 Perl 的網站時,如何使用 Linux shebang (#!/usr/bin/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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.