Perl: почему не устанавливаются переменные окружения? - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь подключиться к БД Oracle, используя perl-DBD-Oracle. Мне нужно установить следующие переменные среды:

export LD_LIBRARY_PATH=/home/x/lib/ora10gclient
export TNS_ADMIN=/home/x/lib/ora10gclient
export PATH=/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin
export ORACLE_HOME=/home/x/lib/ora10gclient

Этот сценарий выполняется пользователем без головы, и я поместил эти строки в файл .bash_profile для этого пользователя без головы.

Проблема в том, что ssh безглавого пользователя входит в компьютер, на котором запущен этот скрипт, а профиль bash не получен. Поэтому я решил установить эти переменные среды в блоке BEGIN скрипта следующим образом:

    BEGIN {
  $ENV{'LD_LIBRARY_PATH'} = '/home/x/lib/ora10gclient';
  $ENV{'TNS_ADMIN'} = '/home/x/lib/ora10gclient';
  $ENV{'PATH'} = '/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin';
  $ENV{'ORACLE_HOME'} = '/home/x/lib/ora10gclient';
}

Тем не менее, скрипт завершается ошибкой, утверждая, что не может найти Oracle.pm, чего не может делать, когда установлены эти переменные среды.

Я распространил операторы print по всему сценарию, чтобы подтвердить, что он действительно устанавливает переменные окружения. И даже распечатал переменные окружения в строке перед попыткой создать дескриптор для БД (где происходит сбой скрипта) и подтвердил, что они по-прежнему имеют правильные значения.

Я также не порождаю дочерние процессы. Ниже приведена упрощенная версия моего сценария, которая не работает аналогичным образом.

    #!/usr/local/bin/perl

use warnings;
use strict;
BEGIN {
  $ENV{'LD_LIBRARY_PATH'} = '/home/x/lib/ora10gclient';
  $ENV{'TNS_ADMIN'} = '/home/x/lib/ora10gclient';
  $ENV{'PATH'} = '/home/x/lib/ora10gclient:/usr/kerberos/bin:/home/x/bin:/home/x/bin64:/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin';
  $ENV{'ORACLE_HOME'} = '/home/x/lib/ora10gclient';
}

use DBI;


testConnect();


sub testConnect {
  my $orclPort = 1521;
  my $orclHost = '<oraclehost>';
  my $orclUser = '<user>';
  my $srvName = '<servicename>';

  my $db = "DBI:Oracle:service_name=$srvName;host=$orclHost;port=$orclPort";
  my $orclDBHndl = DBI->connect($db, $orclUser, $orclUser) or die "could not connect: $DBI::errstr\n";
}

Есть идеи, в чем может быть проблема?

1 Ответ

2 голосов
/ 13 марта 2012

LD_LIBRARY_PATH необходимо установить перед запуском perl. Напишите оболочку оболочки, которая устанавливает переменные и затем запускает ваш скрипт.

Также см. в этой теме для альтернатив и других ссылок на объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...