我正在尝试使用 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。
我正在尝试使用 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。
$ENV{"X1"} = "/p/fsd";
是正确的方法。
测试perlconsole
:
Perl> $ENV{X1} = "/p/fsd";
/p/fsd
Perl> system('echo $X1');
/p/fsd
0
笔记
echo $X1
以防止perl
自行插入。知道如何设置环境变量同样重要的是如何删除它:
delete $ENV{"X1"};
这将删除 perl 进程和任何子进程的环境变量。但仍会为父进程设置环境变量。
因为里面没有特殊字符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
* — 优化代码的行为不应与未优化代码不同,但由于优化只是改变了你得到的错误,它是可以接受的。
正如其他回复所提到的,您不能在子级的父级中设置环境变量。但是,您可以在 perl 中执行一些复杂的操作,然后将最终结果传回 shell 进行设置。例如,在tcsh
:
eval `perl -le 'print q(setenv X1 /p/fsd)'`
你可以让这种感觉更加透明,例如,
alias x1.pl 'eval `x1.pl`'