环境变量在Perl中不起作用

时间:2013-02-18 14:29:03

标签: perl variables environment dbi dbd

我试图在程序的最开始在Perl中设置一些环境变量,但我一直收到错误,除非我在调用我的Perl脚本的Bash脚本中设置它们。

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

这不起作用,但我的shell脚本确实:

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

答案 0 :(得分:6)

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';
}
...

答案 1 :(得分:3)

您的问题可能是在实际设置这些环境变量之前,模块已包含在编译阶段。

如果是这样,如果你将它们放在BEGIN { ... }区块内,它应该可以工作。

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

答案 2 :(得分:0)

当Perl启动时,它会使自己的子shell。该子shell不包含所有功能,例如获取仅适用于主shell的shell文件。您无法从Perl设置或导出主shell的任何环境路径。

您可以使用Bash文件从CPAN获取Perl外部模块中的环境路径,即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上搜索相关模块。