1

プログラムの最初に Perl でいくつかの環境変数を設定しようとしていますが、Perl スクリプトを呼び出す Bash スクリプトで環境変数を設定しない限り、エラーが発生し続けます。

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

これは機能しませんが、私のシェルスクリプトは機能します:

#!/bin/bash
export ORACLE_HOME=path
export LD_LIBRARY_PATH=path
./perlscript.pl

DBI モジュールを機能させるために、これらのパスを設定しています。理想的には、Bash スクリプトを使用せずに、Perl スクリプトでパスを設定したいと考えています。

エラー:

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 が起動すると、独自のサブシェルが作成されます。そのサブ シェルには、メイン シェルでのみ使用可能なシェル ファイルのソースなど、すべての機能が含まれているわけではありません。Perl からメイン シェルの環境パスを設定またはエクスポートすることはできません。

Bash ファイルを使用して、Shell::Source である CPAN から Perl 外部モジュールの環境パスを取得できます。

$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 に答える