1

我试图在程序一开始就在 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) 失败:无法为模块 DBD 加载 /some/path/: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();
4

3 回答 3

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';
}
...
于 2013-02-18T14:40:42.753 回答
3

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

如果是这样,如果您将它们放在一个BEGIN { ... }块中,它应该可以工作。

#!/usr/bin/perl -w
BEGIN
{
    $ENV{'ORACLE_HOME'}='path';
    $ENV{'LD_LIBRARY_PATH'}='path';
}
于 2013-02-18T14:40:36.207 回答
0

当 Perl 启动时,它会生成自己的子 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 上搜索相关模块。

于 2013-07-10T05:43:36.927 回答