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权限.对于其他任何事情,请使用个人用户帐户.
要在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)
有关像这样工作的命令的示例,请参见tset和ssh-agent。
system 启动一个新进程,并且更改环境不会影响脚本进程中的环境(通常 - 通常是依赖于os的方法来更改其他进程的环境).
perl程序中的环境与之相关联%ENV,这有点像(实际上并非)环境的绑定哈希:更改环境会改变环境.从而:
$ENV{LD_LIBRARY_PATH} = '/';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19903 次 |
| 最近记录: |