Как мне проигнорировать Perl Shebang в Windows с Apache 2? - PullRequest
11 голосов
/ 10 января 2010

Я установил локальную веб-среду Perl на моей машине с Windows.Приложение, над которым я работаю, изначально было написано на сервере Linux, и поэтому шебанг для исходных файлов .pl выглядит следующим образом:

#!/usr/bin/perl

Это вызывает следующую ошибку на моем компьютере с Windows:

(OS 2)The system cannot find the file specified.

Можно ли изменить конфигурацию моего Apache 2 так, чтобы на моем компьютере с Windows игнорировался shebang?Конечно, я мог бы установить шебанг на #!c:\perl\bin\perl.exe, это очевидно;но проблема заключается в развертывании обновленных файлов.Ясно, что было бы очень неудобно менять это обратно при каждом развертывании.Я использую ActivePerl в Windows 7.

Обновление:

Я должен был упомянуть, что мне нужно сохранить шебанг, чтобы скрипты работали на нашем общем хостинге Linuxпроизводственный сервер.Если бы у меня не было этого ограничения и мне не нужно было использовать шебанг, очевидным ответом было бы просто не использовать его.

Ответы [ 7 ]

12 голосов
/ 10 января 2010

Я использую #!/usr/bin/perl в своих скриптах и ​​настраиваю Apache в Windows, чтобы игнорировать строку shebang. Добавить

 ScriptInterpreterSource Registry-Strict

на httpd.conf и настройте раздел реестра Windows, как описано в Apache docs .

Вот что я получу при экспорте ключа:

Windows Registry Editor Version 5.00

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

Я использовал эту настройку с Apache и ActiveState Perl на моем ноутбуке с Windows и дистрибутивами Apache и Perl, которые поставляются с ArchLinux на моем сервере.

Документы Apache (на которые я ссылался выше) указывают:

Опция Registry-Strict, которая появилась в Apache 2.0, делает то же самое, что и Registry, но использует только подключ Shell\ExecCGI\Command. Клавиша ExecCGI не является обычной. Он должен быть настроен вручную в реестре Windows и, следовательно, предотвращает случайные вызовы программы в вашей системе . (выделение мое)

4 голосов
/ 10 января 2010

Нет переносной линии Шебанга. Даже на той же платформе и архитектуре кто-то мог установить perl в другом месте.

Хитрость заключается в том, чтобы не устанавливать модули и скрипты вручную. Когда вы упаковываете все как дистрибутивы и используете цепочку инструментов модуля, строки shebang автоматически изменяются, чтобы указать на Perl, который вы использовали для установки всего. Вам не нужно думать об этих деталях. :)

3 голосов
/ 24 августа 2010

Я использую # ! /usr/bin/env perl в качестве шебанга для всего моего Perl, будь то * nix или Windows. Windows просто игнорирует это, и Unixen следует env выбранному perl disto.

1 голос
/ 05 сентября 2015

В win7 и выше вы также можете сделать это с помощью команды "dos" mklink.

Запустите командную оболочку с правами администратора и выполните что-то вроде следующего:

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 голос
/ 09 февраля 2010

Я работал так, чтобы скопировать perl.exe в c: / usr / bin / и переименовать его в perl (убрать .exe)

0 голосов
/ 03 июня 2016
  1. Установка любая версия Windows Bash (например, Cygwin, MSYS2 или GnuWin32);
  2. Создание тривиального сценария перенаправления оболочки:

    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 теперь будет разрешать шебанги Unix в соответствии с интерпретацией, данной выбранной вами разновидностью Bash. Это дает много большей гибкости, чем жесткие пути интерпретатора в реестре.

0 голосов
/ 10 января 2010

У меня под рукой нет 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, хотя я не понимаю, как им это удается.

...