7

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を使用しています。

4

4 に答える 4

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

正しい方法です。

テストインperlconsole

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

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

ノート

于 2012-11-15T00:19:29.413 に答える
7

環境変数を設定する方法を知ることも同様に重要であり、それを削除する方法です。

delete $ENV{"X1"};

これにより、perlプロセスと子プロセスの環境変数が削除されます。ただし、環境変数は引き続き親プロセスに設定されます。

于 2013-11-15T01:33:58.057 に答える
3

には特殊文字がないためsetenv X1 /p/fsd

system("setenv X1 /p/fsd")

と同等です

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

。という名前のプログラムがないため、失敗していsetenvます。この最適化が存在しなかった場合は、別の結果が得られます*。その場合、

system("setenv X1 /p/fsd")

と同等になります

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

コマンドshがないので、それも機能しません。setenvしたがって、代わりに次を実行できます。

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

しかし、それは無意味でしょう。シェルを作成し、その変数の1つを設定します。その後、シェルが終了し、その変数は存在しなくなります。

Perlとその子に見られるenv変数を設定したい場合は、単に

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

また

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

* —最適化されたコードは、最適化されていないコードと同じように動作する必要がありますが、最適化によって発生するエラーが変わるだけなので、許容範囲内です。

于 2012-11-15T00:50:18.077 に答える
1

他の回答が述べているように、子から親に環境変数を設定することはできません。ただし、perlで複雑なことを行ってから、最終結果をシェルに戻して設定することもできます。たとえば、tcsh

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

たとえば、これをもう少し透明に感じさせることができます。

alias x1.pl 'eval `x1.pl`'
于 2012-12-15T13:35:22.107 に答える