簡體   English   中英

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

[英]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
  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 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)?

這對我有用:

  • XAMPP 在 localhost\\{site-name} (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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM