Переменные среды не работают в Perl

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

#!/usr/bin/perl -w
$ENV{'ORACLE_HOME'}='path';
$ENV{'LD_LIBRARY_PATH'}='path';

Это не работает, но мой сценарий оболочки:

#!/bin/bash
export ORACLE_HOME=path
export LD_LIBRARY_PATH=path
./perlscript.pl

Я устанавливаю эти пути, чтобы заставить мой модуль DBI работать. В идеале я хотел бы установить пути в скрипте Perl, а не использовать скрипт Bash.

Ошибка:

Сбой Install_driver (Oracle): Не удается загрузить / some / path / для модуля DBD:Oracle: libclntsh.so.11.1: Не удается открыть файл общего объекта: Нет такого файла или каталога в строке /some/path/DynaLoader.pm 230

Код

use DBI;
my $dbh = DBI->connect("DBI:Oracle:host=something;port=something;sid=something");
my $sth = $dbh->perepare($query);
$sth->execute();
$sth->finish();

3 ответа

Решение

IIRC, потому что библиотека C делает ее собственной копией среды и / или потому что LD_LIBRARY_PATH используется, когда исполняемый файл загружен. Временное решение:

#!/usr/bin/perl -w
if (!$ENV{ORACLE_HOME}) {
    $ENV{ORACLE_HOME} = 'path';
    $ENV{LD_LIBRARY_PATH} = 'path';
    exec($^X, '--', $0, @ARGV);
}
...

В случае, если я ошибаюсь, попробуйте следующее. Он гарантирует, что переменные среды установлены до загрузки модулей, которые их используют.

#!/usr/bin/perl -w
BEGIN {
    $ENV{ORACLE_HOME} = 'path';
    $ENV{LD_LIBRARY_PATH} = 'path';
}
...

Ваша проблема может заключаться в том, что модули включаются в фазу компиляции, прежде чем вы фактически установите эти переменные среды.

Если это так, это должно работать, если вы положите их в BEGIN { ... } блок.

#!/usr/bin/perl -w
BEGIN
{
    $ENV{'ORACLE_HOME'}='path';
    $ENV{'LD_LIBRARY_PATH'}='path';
}

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

Вы можете использовать свой Bash-файл для получения путей к окружению во внешнем модуле Perl из CPAN, который является Shell::Source.

$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/temp.csh");
$env_path->inherit;
print "$ENV{ORACLE_HOME}";
print "$ENV{LD_LIBRARY_PATH}";

Для получения дополнительной информации вы можете найти на CPAN.org соответствующие модули.

Другие вопросы по тегам