我正在尝试使用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。
答案 0 :(得分:10)
$ENV{"X1"} = "/p/fsd";
是正确的方法。
在perlconsole
中进行测试:
Perl> $ENV{X1} = "/p/fsd";
/p/fsd
Perl> system('echo $X1');
/p/fsd
0
注意强>
echo $X1
需要单引号(或反斜杠),以防止perl
自行插入。答案 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`'