我试图在程序的最开始在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();
答案 0 :(得分:6)
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上搜索相关模块。