4

Linuxで変数をエクスポートするだけのスクリプトがあります。

export LD_LIBRARY_PATH=....

このスクリプトを Perl スクリプトで実行したいので、Perl スクリプトを実行している人は誰でも自分のLD_LIBRARY_PATHセットを使用できます。Perl スクリプトの冒頭でこれを行うことはできますか:

#!/usr/bin/perl -w

system(". /myfolder1/myfolder2/myScript.sh");
4

10 に答える 10

10
#!/bin/sh
. /myfolder1/myfolder2/myScript.sh
exec perl -wxS "$0" "$@"
#!/usr/bin/perl -w
# .. the rest of your script as normal

これを実行すると、ローカル環境 /bin/shにロードできるによって最初に実行されます。次に、次の行から続行するように指示されたPerl。myScript.shshexec

于 2009-10-19T20:33:35.823 に答える
5

これは機能しません。Perlスクリプト内の環境を変更するには(およびPerlスクリプト内から実行されるコマンドに渡される環境を変更するには)、%ENV変数を変更します。

$ENV{"LD_LIBRARY_PATH"} = ... ;
于 2009-10-19T20:30:49.727 に答える
4

これはうまくいきません。サブシェルが親プロセスの環境を操作する方法はありません。

しかし、LD_LIBRARY_PATH として設定したい文字列をスクリプトにエコーさせることができ、Perl スクリプト内から次のようなことができます。

$ENV{LD_LIBRARY_PATH} = `path/to/your/script.sh`;

もちろん、ちょっとしたエラーチェックも良い考えかもしれません。

于 2009-10-19T20:28:49.220 に答える
2

私は数年前に同様の問題を抱えており、小さなモジュールEnv::Sourcedを作成しました。これでうまくいくはずです。

 use Env::Sourced qw(/myfolder1/myfolder2/myScript.sh);

...

于 2009-10-19T23:36:46.197 に答える
2

いいえ。子で行われた環境の変更は、親には影響しません。つまり、スクリプトを実行しても perl には影響しません。また、perl はそれが呼び出されたシェルには影響しません。特殊変数 を変更することで、perl 内の環境を編集できます%ENV。そのスクリプトで実行されたある種の再現不可能な計算がある場合、おそらくスクリプトはecho設定だけで、perl はそれを取得しSTDOUTて使用できます。

Perl スクリプトで {ディレクトリを変更し、環境を変更しました}。スクリプトを終了すると、変更が消えたのはなぜですか? 変更を表示するにはどうすればよいですか?

Unix 厳密に言えば、これは実行できません。スクリプトは、開始元のシェルとは別のプロセスとして実行されます。プロセスへの変更はその親には反映されず、変更後に作成された独自の子にのみ反映されます。

于 2009-10-19T20:52:55.287 に答える
1

もう 1 つのオプション (Perl の で直接変更を行う以外%ENV) は、必要な変更を Perl モジュールに行うことで、次のように言えます。

use MyEnvironment;

すべてのスクリプトで環境を変更します。すべてのスクリプトを編集する必要がないため、後で簡単に変更できます。

モジュール自体は次のような単純なものになります。

package MyEnvironment;

$ENV{LD_LIBRARY_PATH} .= ":/some/path/you/want/appended";
# Any other changes you want here.

1;
于 2009-10-19T20:44:47.327 に答える
0

これは、あなたがこれを行おうとしている方法では実行できません。

perlスクリプトを設定して呼び出すラッパーシェルスクリプトが必要であるかLD_LIBRARY_PATH、スクリプトを実行するすべてのユーザーLD_LIBRARY_PATHが最初に正しく設定されている必要があります。

後者を行う場合、これは、シェル/etc/profile/etc/cshrc(ksh、sh、bash、csh、およびtcshの場合)シェルを編集することでグローバルに管理できます。次に、スクリプト内のの値をテストし、LD_LIBRARY_PATH正しく設定/設定されていない場合は、ユーザーにわかりやすいメッセージを出力します。または、個々のユーザーがローカル.profile/.cshrcファイルでこれを設定できます。

注:これを実行する可能性のある環境やユーザーに関する情報は提供されていないため、ユーザーがLD_LIBRARY_PATH必要なものに設定する可能性もあります。LD_LIBRARY_PATHスクリプトで「適切な」値をチェックする場合は、複数のパスが指定されている可能性があるため、この環境変数を適切に解析する必要があることに注意してください。

于 2009-10-19T20:36:15.040 に答える
0

それはうまくいきません。(不快な) 別の方法として、/usr/bin/perl を、最初にスクリプトを実行し、次に perl 実行可能ファイルを実行するシェル スクリプトに置き換えることもできます。

于 2009-10-19T20:29:04.867 に答える
0

Perl スクリプトで適切な場所を見つけることができれば、これは私の例のように機能します。

$ENV{"LD_LIBRARY_PATH"} = "/oracle/product/10g/lib";

環境変数を設定するために別のスクリプトを呼び出す必要もありませんでした。

于 2009-11-13T22:16:19.923 に答える