LD_LIBRARY_PATH
,做法如下:我在
/root
下创建了.profile
文件。
.profile
文件中包含一个export
命令,例如:export LD_LIBRARY_PATH=/
我的Perl脚本是test.pl
,它包含:
#!/usr/bin/perl
system(". /root/.profile");
当我执行
./test.pl
时,LD_LIBRARY_PATH
没有改变。我做错了什么?您当前的脚本甚至没有改变Perl脚本本身中的环境变量。相反,它作为子进程调用了一个shell;该shell进程执行. /root/.profile
,仅在该shell进程中更新$LD_LIBRARY_PATH
。
您可以通过更新%ENV
在Perl脚本中(更准确地说,在运行Perl脚本的进程中)更改环境变量:
$ENV{LD_LIBRARY_PATH} = '/'; # or some more reasonable value
根据perldoc -v %ENV
的说法:
%ENV
哈希变量包含了你当前的环境。在“ENV”中设置一个值,会更改任何你随后"fork()
"出来的子进程的环境。
但是这可能仍然无法满足您的需求;它不会(也不能)影响调用Perl脚本的进程(您的交互式shell)的环境,只能影响Perl进程本身和它调用的任何内容。
我假设您想要更新当前交互式shell进程中的$LD_LIBRARY_PATH
。为此,您可以让Perl脚本打印一个shell命令,该命令将更新$LD_LIBRARY_PATH
。然后,您可以执行这个脚本并评估其输出,而不仅仅是运行它。例如:
$ cat env.pl
#!/usr/bin/perl
use strict;
use warnings;
print "export LD_LIBRARY_PATH=/\n";
$ ./env.pl # just prints the command without executing it
export LD_LIBRARY_PATH=/
$ eval $(./env.pl) # executes the command in the current shell
$ echo $LD_LIBRARY_PATH
/
$
这假设你目前使用的是bash或类似的shell。qx/string/
(perldoc perlop
并搜索“Quote-Like Operators”)。它还有一个eval
函数(perldoc -f eval
)--但当然Perl的eval
需要一个带有Perl语法而非shell语法的参数。但是有更好的方法从Perl脚本中调用Perl代码:将代码放入模块中并调用它,或者只需将代码复制到您的脚本中。 - Keith Thompsonsystem
命令会启动一个新的进程,在其环境变量中做的更改不会影响到您的脚本进程的环境变量(通常情况下如此——一般有特定于操作系统的方式来更改其他进程的环境变量)。
在 Perl 程序中,环境变量与 %ENV
相关联,它有点像一个绑定到环境变量的哈希表:更改它会更改环境变量。因此:
$ENV{LD_LIBRARY_PATH} = '/';
Env::Modify
模块完成此操作:use Env::Modify 'source';
source("/root/.profile");
... env settings of .profile are now available to Perl ...
你做不到。
这段内容来自Perl FAQ:
严格来说,它是做不到的——脚本在执行时与启动它的shell进程不同。对进程所做的更改不会反映在其父进程中,只会反映在任何在更改之后创建的子进程中。有一些shell技巧可以通过在shell中eval()脚本的输出来模拟它;请查看comp.unix.questions FAQ以获取详细信息。
system()
在Perl的子进程中运行shell命令,任何它所做的环境更改都不会影响Perl本身,也不会影响调用Perl的shell。 - Barmar