Linuxで変数をエクスポートするだけのスクリプトがあります。
export LD_LIBRARY_PATH=....
このスクリプトを Perl スクリプトで実行したいので、Perl スクリプトを実行している人は誰でも自分のLD_LIBRARY_PATH
セットを使用できます。Perl スクリプトの冒頭でこれを行うことはできますか:
#!/usr/bin/perl -w
system(". /myfolder1/myfolder2/myScript.sh");
Linuxで変数をエクスポートするだけのスクリプトがあります。
export LD_LIBRARY_PATH=....
このスクリプトを Perl スクリプトで実行したいので、Perl スクリプトを実行している人は誰でも自分のLD_LIBRARY_PATH
セットを使用できます。Perl スクリプトの冒頭でこれを行うことはできますか:
#!/usr/bin/perl -w
system(". /myfolder1/myfolder2/myScript.sh");
#!/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.sh
sh
exec
これは機能しません。Perlスクリプト内の環境を変更するには(およびPerlスクリプト内から実行されるコマンドに渡される環境を変更するには)、%ENV
変数を変更します。
$ENV{"LD_LIBRARY_PATH"} = ... ;
これはうまくいきません。サブシェルが親プロセスの環境を操作する方法はありません。
しかし、LD_LIBRARY_PATH として設定したい文字列をスクリプトにエコーさせることができ、Perl スクリプト内から次のようなことができます。
$ENV{LD_LIBRARY_PATH} = `path/to/your/script.sh`;
もちろん、ちょっとしたエラーチェックも良い考えかもしれません。
私は数年前に同様の問題を抱えており、小さなモジュールEnv::Sourcedを作成しました。これでうまくいくはずです。
use Env::Sourced qw(/myfolder1/myfolder2/myScript.sh);
...
いいえ。子で行われた環境の変更は、親には影響しません。つまり、スクリプトを実行しても perl には影響しません。また、perl はそれが呼び出されたシェルには影響しません。特殊変数 を変更することで、perl 内の環境を編集できます%ENV
。そのスクリプトで実行されたある種の再現不可能な計算がある場合、おそらくスクリプトはecho
設定だけで、perl はそれを取得しSTDOUT
て使用できます。
Perl スクリプトで {ディレクトリを変更し、環境を変更しました}。スクリプトを終了すると、変更が消えたのはなぜですか? 変更を表示するにはどうすればよいですか?
Unix 厳密に言えば、これは実行できません。スクリプトは、開始元のシェルとは別のプロセスとして実行されます。プロセスへの変更はその親には反映されず、変更後に作成された独自の子にのみ反映されます。
もう 1 つのオプション (Perl の で直接変更を行う以外%ENV
) は、必要な変更を Perl モジュールに行うことで、次のように言えます。
use MyEnvironment;
すべてのスクリプトで環境を変更します。すべてのスクリプトを編集する必要がないため、後で簡単に変更できます。
モジュール自体は次のような単純なものになります。
package MyEnvironment;
$ENV{LD_LIBRARY_PATH} .= ":/some/path/you/want/appended";
# Any other changes you want here.
1;
これは、あなたがこれを行おうとしている方法では実行できません。
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
スクリプトで「適切な」値をチェックする場合は、複数のパスが指定されている可能性があるため、この環境変数を適切に解析する必要があることに注意してください。
それはうまくいきません。(不快な) 別の方法として、/usr/bin/perl を、最初にスクリプトを実行し、次に perl 実行可能ファイルを実行するシェル スクリプトに置き換えることもできます。
Perl スクリプトで適切な場所を見つけることができれば、これは私の例のように機能します。
$ENV{"LD_LIBRARY_PATH"} = "/oracle/product/10g/lib";
環境変数を設定するために別のスクリプトを呼び出す必要もありませんでした。