2

サブコマンドから環境をインポートする際に、bashスクリプトからエクスポートされたすべての環境変数をハッシュに追加したいと思います。実行されるとprogram、いくつかの変数が設定され、それらがエクスポートされます。これらの変数を後で使用するためにPerlスクリプトに保存したいと思います。ただし、サブコマンドで定義されているbash関数は使用したくありません。現在、私は次のようなブロックを持っています:

foreach (`program; env`)
{
    next if /^\(\)/;
    my ($a, $b) = split("=", $_);
    if( /^(\w+)=(.*)$/ ) {
        $hash{$1} = $2;    
    }
}

これを行うためのより良い方法はありますか?最初の()を一致させることが安全かどうかはわかりません。環境変数の改行を処理するためのボーナスポイント。今は目を閉じています。

4

3 に答える 3

5

必要なものはそこにあります: Shell-EnvImporter

例:

  use Shell::EnvImporter;

  # Import environment variables exported from a shell script
  my $sourcer  = Shell::EnvImporter->new(
                   file => $filename,
                 );


  my $result = $sourcer->run() or die "Run failed: $@";
于 2009-07-29T15:33:52.670 に答える
1

実行後の環境変数programは、渡された環境と同じではないと想定しています(jejeの回答%ENVで説明されているように見つけることができます) 。

私はbashに精通しているわけではないので、の出力の解析に関する質問の一部にのみ対処しますenv

#!/usr/bin/perl

use strict;
use warnings;

use autodie qw( open close );

$ENV{WACKO} = "test\nstring\nwith\nnewlines\n\n";

my %SUBENV;

open my $env_h, '-|', 'env';

my $var;

while ( my $line = <$env_h> ) {
    chomp $line;
    if ( my ($this_var, $this_val) = $line =~ /^([^=]+)=(.+)$/ ) {
        if ( $this_val =~ /^\Q()\E/ ) {
            $var = q{};
            next;
        }
        $var = $this_var;
        $SUBENV{ $var } = $this_val;
    }
    elsif ( $var ) {
        $SUBENV{ $var } .= "\n$line";
    }
}

use Data::Dumper;
print Dumper \%SUBENV;
于 2009-07-29T15:13:31.290 に答える
0

すべての環境変数を取得するには、これで問題ありません。

for(`program; env`){
  if( /^([^=]+)=(.*)$/ ) {
    $hash{$1} = $2;    
  }
}

白紙の状態から始めたい場合は、これがうまくいくかもしれません。

for(`env -i bash -c "program; env"`){
  next if /\(\)/;
  if( /^([^=]+)=(.*)$/ ) {
    $hash{$1} = $2;    
  }
}

env -iサブコマンドを白紙の状態から開始します。

-c引数と実行するコマンドを指定して bash を呼び出します。そうしないと、2 番目envのプログラムがプログラムから環境変数を取得できないためです。

于 2009-07-29T15:23:05.950 に答える