Perl:为什么我的环境变量没有被设置?

时间:2012-03-13 15:40:29

标签: database perl oracle

我正在尝试使用perl-DBD-Oracle连接到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语句,以确认它确实设置了环境变量。甚至在尝试创建DB的句柄(脚本失败的位置)之前打印出环境变量,并确认它们仍然设置为正确的值。

我也没有产生任何子进程。下面是我的脚本的简化版本,它以相同的方式失败。

    #!/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 个答案:

答案 0 :(得分:2)

在perl启动之前需要设置LD_LIBRARY_PATH。编写一个shell包装器,设置变量,然后启动脚本。

另请参阅this thread了解替代方案和解释的其他链接。