2016-10-04 17 views
2

Perlスクリプト内からBash環境変数(Bashシェルから~/.bashrcを入手することで定義)をロードする方法はありますか?具体的には、Perlスクリプトの呼び出し元がbashプロセスの子でない場合に、PERL5LIB環境変数をリロードすることに興味があります。その場合、$ENV{PERL5LIB}は存在しないため、ホームディレクトリにインストールしたモジュールを使用できなくなります。Perlスクリプト内でBash環境変数を再ロードするには?

オプションを使用してbashの下に自分自身を再実行することが最初の試みです。これは~/.bash_profileをロードし、そのファイルをロードして~/.bashrcに設定しました。

#! /usr/bin/env perl 

use strict; 
use warnings; 

if (!exists $ENV{PERL5LIB}) {  
    exec 'bash', '-lc', $0, @ARGV; 
} 
else { 
    # Main program starts here.. 
} 

しかし、これはPERL5LIB~/.bashrcに定義されていません(予期しない)場合の無限ループに入ることができます。

脚注:Google Chromeの拡張APIを使用してgoogle-chromeプロセスから呼び出されるネイティブホストを記述しようとしたとき

は、[1]この特定のケースでは私のために発生しました。

+0

あなたの拡張機能のようなサウンドは、拡張機能自体と一緒に非標準のライブラリをインストールする必要があります。そして、ユーザーが管理する必要はなく、起動時に(相対)パスをハードコードして '@ INC'に追加できますこれは(あなたのライブラリと彼ら自身のニーズに実際に欲しいものとの間に起こりうるあらゆる衝突)。 – tripleee

+0

ホームディレクトリからモジュールをロードするだけなら、環境変数に頼るのではなく、ホームディレクトリで 'use lib'を実行してみてはどうでしょうか? – cdarke

+5

あなたのスクリプトは、呼び出し元が* bashを使用しているかどうか知りません。スクリプトを呼び出すときに 'PERL5LIB'が適切な値になっていることを確認するのは呼び出し側の責任です。 – chepner

答えて

0
#! /usr/bin/env perl 

use strict; 
use warnings; 

BEGIN { 
    if (!exists($ENV{PERL5LIB})) {  
     if ([email protected] || $ARGV[0] ne '--no-restart') { 
      exec('bash', '-lc', '"[email protected]"', $0, $^X, $0, '--no-restart', @ARGV); 
     } 
    } 

    if (@ARGV && $ARGV[0] eq '--no-restart') { 
     shift(@ARGV); 
    } 
} 

... 

よう

何か(もちろん、Getoptの::ロングを使用したり、いくつかの-そのようなものが良いでしょう。)

これはあなたのスペックを満たしているが、必要に応じてバイパスを提供するだけではなく、 。

つまり、全体のコンセプトには欠陥があります。ほとんどの人はPERL5LIBを使用すべきではありません。不適切に構成されたシステム(PERL5LIBを必要とするが、設定が必要なときには設定されていないシステム)を修正するのはあなたの仕事ではありません。代わりに、fix your environment

+0

コードをありがとう。しかし、私はそれの周りに私の頭を取得するいくつかの難しさがあります。 'bash'に渡される引数:なぜ' $ 0'が2回渡されますか? '$ @'は何をしていますか? –

+1

スクリプトの後の最初の引数は、 '$ 0'、' $ 1'の次のもの、 '$ 2'の次のものなどに置かれます。' '$ @" 'は" $ 1 "" $ 2 "" $ 3 "と等価です。 .. '。 '$ 0'は使用しないので、値を渡すことができます。 'bash -c echo foo bar'と' bash -c '"$ @"' dummy echo foo bar'を比較してください – ikegami

+0

ありがとうございました。しかし、なぜ私たちは 'PERL5LIB'を使うべきではありませんか?私はいつもそれを使ってきました。最初に 'cpan App :: cpanminus'をインストールします。この初期インストール時に 'cpan'は私のホームディレクトリかシステムディレクトリにインストールするかを尋ねます(root権限が必要です)。私はいつも自分のホームディレクトリにインストールすることを選択します。次に、PERL5LIBを設定する必要があります。 –

6

Env::Modifyシェルスクリプトから環境を変更することができます。

use Env::Modify 'source'; 

# BEGIN { ??? 
if (!exists($ENV{PERL5LIB})) { 
    source("$ENV{HOME}/.bashrc"); 
    die "PERL5LIB not in .bashrc" unless $ENV{PERL5LIB}; 
    exec($^X, $0, @ARGV);  # restart 
} 
+0

ありがとうございますが、今問題は 'Env :: Modify'も私のホームディレクトリにインストールされていることです(私は' cpanm'を使用しています)。 –

関連する問題