2010-12-16 3 views
1

У меня есть CGI скрипт, подобный следующему:переменная Окружающая среда для PERL CGI скриптов

BEGIN { 
    unshift (@INC, "$ENV{'HOME'}/www/cgi-bin/SiteSpecific"); 
} 

print "Content-type: text/html\n\n"; 
use SiteObject; 
my $siteObjInst = SiteObject->instance(); 
print $siteObjInst->{HideFields}; 

Это прекрасно работать из командной строки, но терпит неудачу при запуске как CGI скрипт из браузера. $ ENV {'HOME'}, возможно, не задан, так как скрипт не может найти модуль.

Является ли это тем, что скрипты CGI не запускаются внутри оболочки и не могут найти переменные окружения?

Если это верно, нужно ли установить желаемые переменные в блоке BEGIN, используя другие средства?

Благодарим за помощь.

ответ

1

Вы определенно не можете гарантировать, что ваша оболочка и идентификатор, работающий на веб-сервере, имеют одну и ту же переменную для $ENV{HOME}. Забудьте все, что код на некоторое время и попробуйте это:

print "Content-type: text/html\n\n"; 
print q[<html><head><title>A Page</title></head>] 
    . qq[<body><h1>\$HOME=$ENV{HOME}</h1></body></html>] 
    ; 

Или даже так:

use strict; 
use warnings; 
use CGI; 

my $q = CGI->new; 
print $q->header 
    , $q->start_html('A Page') 
    , $q->start_table 
    , $q->Tr($q->th('Name'), $q->th('Value')) 
    , (map { $q->Tr($q->td($_), $q->td($ENV{$_})) } sort keys %ENV) 
    , $q->end_table 
    , $q->end_html 
    ; 
+0

Я уже многому учусь из ваших ответов. Тем не менее, я пытаюсь решить конкретную проблему. – rpat 2010-12-16 06:41:55

3

Программа CGI будет ее окружение устанавливается на веб-сервере. HOME может устанавливаться или не устанавливаться в зависимости от того, как настроен ваш веб-сервер, и если он установлен, он, вероятно, укажет на домашний каталог пользователя, на котором работает веб-сервер, а не на ваш домашний каталог.

Вы можете распечатать значение $ ENV {HOME} из программы CGI или даже лучше распечатать весь хэш% ENV, чтобы увидеть, что происходит на самом деле.

По моему опыту, он лучше всего жестко кодирует полный путь к дополнительным библиотекам или устанавливает путь извне (например, используя PERL5LIB). Если вы устанавливаете его внутри программы, используйте «Lib» Прагма вместо изменения @INC непосредственно:

use lib '/home/user/www/cgi-bin/siteSpecific'; 
Смежные вопросы