使用perl设置环境变量

时间:2012-11-15 00:18:07

标签: perl variables environment tcsh

我正在尝试使用Perl设置环境变量。它应该在外部(在当前shell中)将此变量导出到脚本中。

我试过了:

`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 个答案:

答案 0 :(得分:10)

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

是正确的方法。

perlconsole中进行测试:

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

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

注意

答案 1 :(得分: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")

但这毫无意义。你要创建一个shell,设置一个变量。然后shell退出并且它的变量不再存在。

如果要设置Perl及其子项所看到的env var,只需使用

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

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

* - 优化代码的行为不应与未经优化的代码不同,但由于优化只会改变您获得的错误,因此可以接受。

答案 2 :(得分:2)

了解如何设置env变量同样重要的是如何删除它:

delete $ENV{"X1"};

这将删除perl进程和任何子进程的环境变量。但是仍然会为父进程设置环境变量。

答案 3 :(得分:1)

正如其他回复所提到的,您无法在子级中设置父级的环境变量。但是,您可以在perl中执行一些复杂的操作,然后将最终结果传递回要设置的shell。例如,在tcsh

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

你可以让这种感觉更加透明,例如,

alias x1.pl 'eval `x1.pl`'