2012-03-13 189 views
1

我正嘗試使用perl-DBD-Oracle連接到Oracle數據庫。我需要設置以下環境變量:Perl:爲什麼我的環境變量沒有被設置?

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"; 
} 

任何想法可能是什麼問題?

+0

你的PERL5LIB是否也適用於任何設備? – vmpstr 2012-03-13 15:44:10

回答

2

需要在perl啓動之前設置LD_LIBRARY_PATH。編寫一個設置變量的shell包裝器,然後啓動你的腳本。

另請參閱this thread瞭解替代方案和其他解釋鏈接。

+0

但我認爲把它放在BEGIN塊中可以解決這個問題。爲什麼沒有工作? – 2012-03-13 16:29:42

+2

@phileas fogg,Perl在執行BEGIN塊時已經加載了相當長的一段時間。 – ikegami 2012-03-13 16:47:04

+0

由於'BEGIN'塊在perl啓動後發生。我不知道你如何看待perl在執行perl之前可以以某種方式執行'BEGIN'塊... – CanSpice 2012-03-13 16:48:09

相關問題