环境变量在Perl中不起作用

Jam*_*ren 1 variables environment perl dbi dbd

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

#!/usr/bin/perl -w
$ENV{'ORACLE_HOME'}='path';
$ENV{'LD_LIBRARY_PATH'}='path';
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
export ORACLE_HOME=path
export LD_LIBRARY_PATH=path
./perlscript.pl
Run Code Online (Sandbox Code Playgroud)

我正在设置这些路径以使我的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();
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 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);
}
...
Run Code Online (Sandbox Code Playgroud)

如果我错了,请先尝试以下方法.它确保在加载使用它们的模块之前设置环境变量.

#!/usr/bin/perl -w
BEGIN {
    $ENV{ORACLE_HOME} = 'path';
    $ENV{LD_LIBRARY_PATH} = 'path';
}
...
Run Code Online (Sandbox Code Playgroud)