通过Perl脚本设置环境variables

我正在尝试通过以下方式通过Perl脚本设置环境variablesLD_LIBRARY_PATH

我在/root下创build了.profile

.profile有一个export命令说:

 export LD_LIBRARY_PATH=/ 

我的Perl脚本是test.pl ,它有:

 #!/usr/bin/perl system(". /root/.profile"); 

当我执行./test.plLD_LIBRARY_PATH不会改变。

我究竟做错了什么?

Solutions Collecting From Web of "通过Perl脚本设置环境variables"

您当前的脚本甚至不会在Perl脚本本身中更改环境变量。 相反,它调用一个shell作为子进程; 该shell进程执行. /root/.profile . /root/.profile ,仅在该shell进程中更新$LD_LIBRARY_PATH

您可以通过更新%ENV来更改Perl脚本中的环境变量(更确切地说,在运行Perl脚本的过程中):

 $ENV{LD_LIBRARY_PATH} = '/'; # or some more reasonable value 

由于perldoc -v %ENV说:

%ENV哈希%ENV包含您当前的环境。 在“ENV”中设置一个值可以改变您随后“ fork() ”关闭的任何子进程的环境。

但那可能还是不会做你想要的; 它不会(也不会)影响调用Perl脚本(您的交互式shell)的进程的环境,只会影响Perl进程本身以及它调用的任何东西。

我假设你想在当前的交互式shell进程中更新$LD_LIBRARY_PATH 。 为此,您可以让Perl脚本打印一个shell命令来更新$LD_LIBRARY_PATH 。 然后,可以执行它,然后评估它的输出,而不是简单地运行Perl脚本。 例如:

 $ 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 / $ 

这假定你当前的shell是bash或类似的东西。

另一个选项:修改%ENV ,Perl脚本可以调用另一个命令,甚至是一个新的交互式shell。 新进程将从Perl脚本继承它的环境。 虽然这可能有点麻烦, 例如,如果新进程是交互式shell,则不会从父shell中继承未导出的变量或历史记录。

(注意,与你的问题没有直接关系:你搞乱了/root/.profile这个事实意味着你正在做的事情是root (超级用户)。这可能是危险的。使用root帐户(通过日志进入它或通过sudo只为实际需要root权限的东西。对于其他任何事情,使用个人用户帐户。

system开始一个新的过程,改变环境不会影响你的脚本过程中的环境(通常 – 通常有改变其他过程环境的操作系统依赖的手段)。

perl程序中的环境与%ENV ,这与%ENV的并列散列有些类似(实际上并不相同):更改它会改变环境。 从而:

 $ENV{LD_LIBRARY_PATH} = '/'; 

要在Perl脚本中更改环境,请指定%ENV哈希值:

 $ENV{'LD_LIBRARY_PATH'} = '/'; 

如果你想编写一个被shell使用的程序来改变它的环境,通常这样做的方法是让脚本写shell命令到stdout。 然后,shell通过命令替换执行此操作,并使用eval来执行结果命令:

Perl脚本:

 #!/usr/bin/perl print 'LD_LIBRARY_PATH=\n'; 

Shell脚本:

 eval "$(/path/to/perlscript)" 

有关这样工作的命令示例,请参阅tsetssh-agent

现在可以使用Env::Modify模块来完成这个工作:

 use Env::Modify 'source'; source("/root/.profile"); ... env settings of .profile are now available to Perl ... 

你不能这样做。

这是来自Perl FAQ :

从最严格的意义上说,这是不可能完成的 – 脚本作为与从其开始的shell不同的进程来执行。 对流程的更改不会反映在其父项中 – 只能在更改后创建的任何子项中反映。 有一些shell魔法可以让你通过eval()脚本的输出来伪装它, 查看comp.unix.questions FAQ获取详细信息。