通过Perl脚本设置环境变量

use*_*437 6 linux bash perl sh

我试图LD_LIBRARY_PATH通过以下方式通过Perl脚本设置环境变量:

我创建了.profile/root

.profile有一个export命令说:

export LD_LIBRARY_PATH=/
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/perl
system(". /root/.profile");
Run Code Online (Sandbox Code Playgroud)

当我执行时./test.pl,LD_LIBRARY_PATH不会改变.

我究竟做错了什么?

Kei*_*son 12

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

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

$ENV{LD_LIBRARY_PATH} = '/'; # or some more reasonable value
Run Code Online (Sandbox Code Playgroud)

如上所述perldoc -v %ENV:

%ENV哈希%ENV包含您当前的环境.在"ENV"中设置值会更改随后fork()"关闭"的任何子进程的环境.

但那可能仍然不会做你想要的; 它不会(也不会)影响调用Perl脚本(您的交互式shell)的进程的环境,只会影响Perl进程本身及其调用的任何内容.

我假设您要更新$LD_LIBRARY_PATH当前的交互式shell进程.为此,您可以让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 
/
$ 
Run Code Online (Sandbox Code Playgroud)

这假设您当前的shell是bash或类似的东西.

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

(一个注意事项,与你的问题没有直接关系:你搞乱的事实/root/.profile意味着你正在做的事情root(超级用户).这可能是危险的.使用root帐户(通过登录或sudo仅通过事物)实际上需要root权限.对于其他任何事情,请使用个人用户帐户.


Bar*_*mar 5

要在Perl脚本中更改环境,请分配给%ENV哈希:

$ENV{'LD_LIBRARY_PATH'} = '/';
Run Code Online (Sandbox Code Playgroud)

如果要编写一个shell用来更改其环境的程序,通常的做法是让脚本将shell命令写入stdout。然后,shell使用命令替换执行此操作,并用于eval执行结果命令:

Perl脚本:

#!/usr/bin/perl
print 'LD_LIBRARY_PATH=\n';
Run Code Online (Sandbox Code Playgroud)

Shell脚本:

eval "$(/path/to/perlscript)"
Run Code Online (Sandbox Code Playgroud)

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


muh*_*ten 5

system 启动一个新进程,并且更改环境不会影响脚本进程中的环境(通常 - 通常是依赖于os的方法来更改其他进程的环境).

perl程序中的环境与之相关联%ENV,这有点像(实际上并非)环境的绑定哈希:更改环境会改变环境.从而:

$ENV{LD_LIBRARY_PATH} = '/';
Run Code Online (Sandbox Code Playgroud)