/ / Perlスクリプト内でシェル変数をエクスポートする方法は? -perl、unix、shell、環境変数

Perlスクリプト内でシェル変数をエクスポートするには? - perl、unix、shell、環境変数

シェル変数のリストを含むシェルスクリプトがあり、プログラミング環境に入る前に実行されます。

Perlスクリプトを使用してプログラミング環境に入りたい:

system("environment_defaults.sh");
system("obe");

しかし、環境に入ると、変数は設定されません。

回答:

回答№1については9

2番目のコマンドを呼び出すと、最初のコマンドで変更した環境では実行されません。実際、 「environment_defaults.sh」を呼び出すために使用されるシェルが既に終了しているため、最初のコマンドから環境が残りません。

2番目のコマンドの最初のコマンドのコンテキストを保持するには、同じシェルでそれらを呼び出します。

system("source environment_defaults.sh && obe");

でシェルスクリプトを呼び出す必要があることに注意してください source でそのアクションを実行するために 現在 新しいシェルを呼び出して実行するのではなく、シェル。

または、すべてのシェルの先頭で環境を変更し(たとえば、bashを使用している場合は.bash_profileを使用)、perl自体で環境変数を変更します。

$ENV{FOO} = "hello";
system("echo $FOO");

回答№2については2

異なる sh -c プロセスが呼び出され、これらの中に環境変数が分離されます。

また、「environment_defaults.shを呼び出しても、これらの変数が個別に設定される範囲内で別のshプロセスを作成しませんか?」

または、これらの環境変数をエクスポートしてPerlスクリプトを開始すると、これらの環境変数がすべての子プロセスに設定されます。


答え№3の2

各プロセスは独自の環境を取得し、「システム」を呼び出すたびに新しいプロセスを実行します。したがって、あなたがしていることは「機能しません。あなたは」単一のプロセスで両方のコマンドを実行する必要があります。

ただし、Perlスクリプトの後に注意してくださいPerlスクリプトも独自の環境を備えたプロセスであるため、コマンドラインで設定した環境変数は使用できません。


回答№4の場合は0

更新:ああ、これはまさにあなたが求めたものではありませんが、誰かに役立つかもしれません。)

もし GDB インストールされている場合、次のハックで親シェル変数を設定/変更できます(明確にするために非厳密なスタイルが使用されます)。

#!/usr/bin/perl
# export.pl

use File::Temp qw( tempfile );

%vars = (
a => 3,
b => "pigs"
);

$ppid = getppid;

my @putvars = map { "call putenv ("$_=$vars{$_}")" } keys %vars;

$" = "n";

$cmds = <<EOF;
attach $ppid
@putvars
detach
quit
EOF

($tmpfh, $tmpfn) = tempfile( UNLINK => 1 );
print $tmpfh $cmds;

`gdb -x $tmpfn`

テスト:

$ echo "$a $b"

$ ./export.pl
$ echo "$a $b"
3 pigs

回答№5の場合は0

でも、はい!そうかも知れない!

#!/usr/bin/perl -w

use strict;

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

eval "%ENV=(".$1.")" if `bash -c "
source environment_defaults.sh >/dev/null;
$perldumpenv"`
=~ /^s*{(.*)}s*$/mxs;

system("obe");

少し やり過ぎ これは、Perlのみのダンプ環境への分岐を実行しますが、安全な方法でPerlバインド環境を実行し、 Data::Dumperその Perl変数の送信/保存および取得に使用するライブラリ。

注意: これはセキュリティの考慮事項を気にしません: あなたは信頼しなければなりません environment_defaults.sh メインのPerlスクリプトと同じレベルで!!!


答え№6の場合は0

これは、 Env::Modify モジュール

use Env::Modify "source";   # or use Env::Modify qw(source system);
source("environment_defaults.sh");
... environment from  environment_defaults.sh  is now available
... to Perl and to the following "system" call
system("obe");