Я написал несколько тестовых сценариев, чтобы убедиться, что среда изменяется при изменении %ENV
:
use strict;
use warnings;
use feature qw(say);
BEGIN {
my $foo = "bar-bar";
$ENV{FOO} = "$foo";
}
system qq(/bin/echo printing out \$FOO);
Это распечатывает:
printing out bar-bar
что я и ожидал.
Я тогда попробовал это:
use strict;
use warnings;
use feature qw(say);
BEGIN {
my $foo = "bar-bar";
$ENV{FOO} = "$foo";
}
system qq(./test.sh);
и создал test.sh
программу, которая выглядит следующим образом:
#! /bin/sh
echo This is what I got: $FOO;
В этом случае мой Perl-скрипт работает test.sh
, который выводит значение переменной среды $FOO
, которая была установлена в моем Perl-скрипте. Запуск test.pl
Я получаю:
This is what I got bar-bar
Это показывает, что Perl не только устанавливает переменные среды, но и экспортирует эти переменные, так называемые сценарии оболочки имеют к ним доступ.
Вы можете попробовать подобную технику, чтобы убедиться, что оба параметра LD_LIBRARY_PATH
и ORACLE_HOME
установлены перед их использованием. Я подозреваю, что вы обнаружите, что это действительно происходит, но ваша программа все еще не работает, когда вы установили %ENV
.
Это указывает на один вывод: установка среды для LD_LIBRARY_PATH
и ORACLE_HOME
может произойти слишком поздно к моменту запуска вашего Perl-скрипта. Я полагаю, что операционная система проверяет LD_LIBRARY_PATH
до запуска Perl. Я нашел это, выполнив поиск по LD_LIBRARY_PATH
:
LD_LIBRARY_PATH - это переменная среды, для которой вы установили , дайте загрузчику совместно используемых библиотек времени выполнения (ld.so) дополнительный набор каталогов, который нужно искать при поиске общих библиотек . Можно указать несколько каталогов, разделенных двоеточием (:). Этот список добавляется к существующему списку скомпилированных путей загрузчика для данного исполняемого файла и любых системных путей загрузчика по умолчанию.
Итак, LD_LIBRARY_PATH
для загрузчика общей библиотеки времени выполнения ld.so
. Если ld.so
уже загружен, изменение LD_LIBRARY_PATH
ничего не даст.
Я нашел подобное обсуждение на Perl Monks . Я заметил, что кто-то нашел повторный запуск env
, казалось, работал.