7

我正在尝试使用 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

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")

但这将毫无意义。您将创建一个外壳,设置其中一个变量。然后 shell 退出并且它的变量不再存在。

如果你想设置 Perl 及其子级可以看到的环境变量,只需使用

$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 中执行一些复杂的操作,然后将最终结果传回 shell 进行设置。例如,在tcsh

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

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

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