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 次 |
最近记录: |