2012-11-15 20 views
5

Perlを使用して環境変数を設定しようとしています。スクリプト内だけでなく、(現在のシェル内で)この変数を外部にエクスポートする必要があります。環境変数perlを使用して

私が試した:

`setenv X1 /p/fsd` 

system("setenv X1 /p/fsd") == 0 or die "failed:$?" 

system command "setenv X1 /p/fsd" failed: -1 

$ENV{"X1"} = "/p/fsd"; 

を何も動いていないようで。

私はTCSHを使用しています。

+0

[Perlスクリプトで環境変数を設定する](http://stackoverflow.com/questions/19192682/setting-an-environment-variable-through-a-perl-script) –

答えて

10
$ENV{"X1"} = "/p/fsd"; 

は正しい方法です。 perlconsole

試験:

Perl> $ENV{X1} = "/p/fsd"; 
/p/fsd 

Perl> system('echo $X1'); 
/p/fsd 
0 

  • 単一引用符(またはバックスラッシュ)は、それ自体を補間するperlを防止するecho $X1に必要とされます。
  • あなたは特別な文字がsetenv X1 /p/fsdにありませんのでhttp://www.perlmonks.org/?node_id=684685
+0

これは有効ですスクリプトが実行されている間、そうですか?スクリプトが停止すると、それらはなくなってしまいます。私がやろうとしているのは、SHELLに10-15環境変数があり、頻繁に更新されるということです。だから私の代わりに、手動でそれらを設定する..私はそれをスクリプトに考えていた。 – user1793023

+0

これはサブシェルの原理です。あなたが父親を殺すと、あなたも息子を殺します。これは悲しいことですが、これは人生です。 –

+0

サブシェルと親に関する説明のリンクを追加しました。 –

3

を参照して、親シェルのENVを変更することはできません、

system("setenv X1 /p/fsd") 

がありますので、それが失敗しています

system("setenv", "X1", "/p/fsd") 

に相当しますプログラム名はsetenvです。この最適化が存在しない場合は、別の結果が得られます*。その場合には、

system("setenv X1 /p/fsd") 

shは何setenvコマンドを持っていないので、どちらかを動作しません

system("sh", "-c", "setenv X1 /p/fsd") 

に相当します。だからあなたは次の代わりに以下を実行することができます:

system("tcsh", "-c", "setenv X1 /p/fsd") 

しかしそれは無意味です。シェルを作成し、その変数の1つを設定します。シェルは終了し、その変数は存在しなくなります。あなたはPerlとその子から見たenv VARを設定したい場合は

、単に は

local $ENV{X1} = "/p/fsd"; # Until end of scope 

* —最適化されたコードが最適化されていないと異なる動作べきではありません

$ENV{X1} = "/p/fsd";   # Until end of program 

または

使用しかし、最適化はあなたが得るエラーを変更するだけなので、それは受け入れられます。

1

他の返信に記載されているように、親の環境変数を子から設定することはできません。しかし、perlで何か複雑なことをして、最終結果をシェルに戻して設定することができます。例えば、tcshに:

eval `perl -le 'print q(setenv X1 /p/fsd)'` 

あなたは、これは例えば、もう少し透明と感じさせることができ、

alias x1.pl 'eval `x1.pl`' 
+0

'ssh-agent'には同じ問題がある。シェルを呼び出す)、同じ 'eval'トリックを使います。それは 'sh 'と' csh'( '-s' resp。' -c')で異なるsetenvの構文を切り替えることさえあります。 –

2

同様に重要なのenv変数を設定する方法を知るためには、それを削除する方法です。

delete $ENV{"X1"}; 

これは、perlプロセスとすべての子プロセスの環境変数を削除します。しかし環境変数は親プロセスのために設定されます。

+0

* "X1" *または* X1 *にする必要がありますか? –

+0

@PeterMortensenこれらは同等です。一般的に、引用符は単純なので引用符を省略しています。特に環境変数はすべて大文字と特殊文字ではないためです。奇妙な特殊文字を使用している場合は、引用符が必要な場合があります。 [このディスカッション](http://stackoverflow.com/questions/401556/are-quotes-around-hash-keys-a-good-practice-in-perl)を参照してください。 – mareoraft

関連する問題