1

Perl コード

`. /home/chronicles/logon.sh `; 

print "DATA  : $ENV{ID}\n";

logon.sh では、変数「ID」をエクスポートしています (シェル スクリプトのソース)。

手動実行

$> . /home/chronicles/logon.sh
$> echo $LOG

ターミナルで(スクリプトからではなく)手動で実行している間。出力を取得しています。(ただし、スクリプトからは機能しません)

私はこの投稿をフォローしました:

Perlスクリプト内でシェル変数をエクスポートするには?

しかし、問題を解決しませんでした。

ノート

「logon.sh」スクリプトを変更することはできません。

4

6 に答える 6

2

バッククォート内のスクリプトは子プロセスで実行されます。環境変数はプロセスから継承されますが、親は子プロセスの環境にアクセスできません。

ただし、子環境変数の内容を返して、次のように Perl 変数に入れることができます。

use strict; use warnings; use feature 'say';
my $var = `ID=42; echo \$ID`;
chomp $var;
say "DATA: $var";

出力:

DATA: 42

シェル セッションの例を次に示します。

$ cat test_script
echo foo
export test_var=42
$ perl -E'my $cmd = q(test_var=0; . test_script >/dev/null; echo $test_var); my $var = qx($cmd); chomp $var; say "DATA: $var"'
DATA: 42

通常の出力は にリダイレクトされる/dev/nullため、 のみがecho $test_var表示されます。

于 2012-12-28T14:37:02.913 に答える
1

さて、私にとってはいいと思う解決策を見つけました:これは広くテストされたメカニズムを使用してシェル環境をperl(perlを実行)にバインドし、堅牢なライブラリを使用してそれらをperl変数構文でエクスポートして再注入するため、これは堅牢に見えますルートperlセッションで。

この行export COLOR ttyは、bashに新しい変数をエクスポートするように依頼するのに役立ちました...これは問題なく機能しているようです。

#!/usr/bin/perl -w

my $perldumpenv='perl -MData::Dumper -e '."'".
    '\$Data::Dumper::Terse=1;print Dumper(\%ENV);'."'";

eval '%ENV=('.$1.')' if `bash -c "
        . ./home/chronicles/logon.sh;
        export COLOR tty ID;
        $perldumpenv"`
    =~ /^\s*\{(.*)\}\s*$/mxs;

# map { printf "%-30s::%s\n",$_,$ENV{$_} } keys %ENV;
printf "%s\n", $ENV{'ID'};

とにかく、にアクセスできない場合は、そのようなソリューションを実行する前にそれlogon.sh信頼する必要があります。

年...

私の最初の投稿があります...歴史の目的のために、これ以上見ないでください。

唯一の方法は、コマンドにenvironをダンプするように要求しながら、結果コマンドを解析することです。

my @lines=split("\n",`. /home/chronicles/logon.sh;set`);

map { $ENV{$1}=$2 if /^([^ =])=(.*)$/; } @lines;
于 2012-12-28T15:03:43.420 に答える
1

うまくいきません。

環境変数は子プロセスから継承できません。

「手動実行」で環境変数を更新できるのは、同じ「bash」プロセスにあるためです。

ソース コマンドは、現在のシェルで login.sh のすべてのコマンドを実行するだけです。

参照できる詳細情報: can we source a shell script in perl script

于 2012-12-28T14:34:08.417 に答える
1

次のようなことができます:

#/usr/bin/perl

use strict;
use warnings;

chomp(my @values = `. myscript.sh; env`);

foreach my $value (@values) {
    my ($k, $v) = split /=/, $value;
    $ENV{$k} = $v;
}

foreach my $key (keys %ENV) {
    print "$key => $ENV{$key}\n";
}
于 2012-12-28T15:40:54.677 に答える
1

これは、モジュールで実行できるようになりましたEnv::Modify

use Env::Modify 'source';
source("/home/chronicles/logon.sh");
... environment setup in logon.sh is now available to Perl ...
于 2017-01-30T16:20:29.397 に答える
0

Perl プロセスはシェル プロセスの親であるため、シェル プロセスから環境変数を継承しません。継承は、親から子へと逆に機能します。

ただし、示されているように、バッククォートを使用してスクリプトを実行すると、スクリプトの標準出力が Perl スクリプトに返されます。したがって、表示されている echo $LOG ステートメントで終了するようにシェル スクリプトを変更するか、login.sh を実行してから echo $LOG を持つ新しいシェル スクリプトを作成します。Perl スクリプトは次のようになります。

my $value = `./myscript.sh`;
print $value;
于 2012-12-28T14:40:27.357 に答える