Linux 如何将环境设置导入Perl程序?

Linux 如何将环境设置导入Perl程序?,linux,perl,environment,Linux,Perl,Environment,我有一个脚本,它的内容只是在linux中导出一个变量 export LD_LIBRARY_PATH=.... 我想在我的Perl脚本中运行这个脚本,这样运行我的Perl脚本的人都将设置他们的LD\u LIBRARY\u路径。我可以在Perl脚本的开头这样做吗: #!/usr/bin/perl -w system(". /myfolder1/myfolder2/myScript.sh"); 这行不通。子shell无法操纵父进程的环境 但您可以让脚本回显要设置为LD_LIBRARY_PATH的

我有一个脚本,它的内容只是在linux中导出一个变量

export LD_LIBRARY_PATH=....
我想在我的Perl脚本中运行这个脚本,这样运行我的Perl脚本的人都将设置他们的
LD\u LIBRARY\u路径。我可以在Perl脚本的开头这样做吗:

#!/usr/bin/perl -w

system(". /myfolder1/myfolder2/myScript.sh");

这行不通。子shell无法操纵父进程的环境

但您可以让脚本回显要设置为LD_LIBRARY_PATH的字符串,然后在Perl脚本中执行类似操作:

$ENV{LD_LIBRARY_PATH} = `path/to/your/script.sh`;

当然,一点错误检查也可能是一个好主意。

那是行不通的。(令人不快的)替代方法可能是用shell脚本替换/usr/bin/perl,该脚本首先执行脚本,然后执行perl可执行文件。

这不起作用。要更改Perl脚本内部的环境(以及要更改将传递给从Perl脚本内部运行的命令的环境),请更改
%ENV
变量

$ENV{"LD_LIBRARY_PATH"} = ... ;

运行此命令时,它将首先由
/bin/sh
执行,该命令能够将
myScript.sh
加载到本地环境中
sh
然后
exec
s Perl,它被告知从下一行继续。

这不能以您尝试的方式完成

它需要设置
LD\u LIBRARY\u PATH
然后调用perl脚本的包装shell脚本,或者执行脚本的任何用户首先需要正确设置
LD\u LIBRARY\u PATH

如果执行后者,则可以通过编辑
/etc/profile
/etc/cshrc
(对于ksh、sh、bash、csh和tcsh)shell来全局管理。然后,您可以在脚本中测试
LD_LIBRARY_PATH
的值,如果设置/设置不正确,则向用户打印友好消息。或者,个人用户可以在其本地
.profile
/
.cshrc
文件中进行设置

注意:您尚未提供任何有关可能运行此功能的环境或用户的信息,因此用户也可能会将
LD\u LIBRARY\u PATH
设置为他们需要的内容。如果您确实检查脚本中的
LD_LIBRARY_PATH
是否有“良好”值,那么请记住,可能已经指定了多个路径,因此您需要正确解析此环境变量。

另一个选项(除了直接在Perl的
%ENV
中进行更改)是对Perl模块进行更改,所以你可以说:

use MyEnvironment;
并让它在所有脚本中修改您的环境。这将使在不需要编辑每个脚本的情况下进行更改变得简单

模块本身很简单,如下所示:

package MyEnvironment;

$ENV{LD_LIBRARY_PATH} .= ":/some/path/you/want/appended";
# Any other changes you want here.

1;

不可以。在子级中所做的环境更改不会影响父级。这意味着运行脚本不会影响perl。perl也不会影响调用它的shell。您可以通过更改。如果在该脚本中执行了某种不可复制的计算,那么该脚本可能只需响应设置,perl就可以在STDOUT上获取该设置并使用它

Unix严格来说,这是不可能做到的——脚本会执行 作为与外壳不同的过程 它是从一开始的。更改为 过程并没有反映在它的 父母,只在自己的孩子 在更改后创建


几年前,我遇到了一个类似的问题,我设计了一个小模块,应该可以解决这个问题

 use Env::Sourced qw(/myfolder1/myfolder2/myScript.sh);

如果您能在perl脚本中找到正确的位置,这将与我的示例中一样工作:

$ENV{"LD_LIBRARY_PATH"} = "/oracle/product/10g/lib";
它不需要我调用另一个脚本来设置环境变量。

模块解决了这个问题,至少对于POSIX-y平台:

use Env::Modify 'source';
source("/myfolder1/myfolder2/myScript.sh");
... environment settings from myScript.sh are now available to Perl ...

逆转这个过程。调用设置变量的shell脚本,然后使用它运行perl脚本。请参阅我编辑的答案。但是,由于您正在尝试设置LD_LIBRARY_PATH,因此在Perl脚本已经运行时设置它可能已经太晚了。你到底想做什么?我的perl脚本调用oracle数据库,这需要设置。它可能是从其他用户登录运行的。否,这个答案直接操纵了Perl对环境的想法。当然,此语法与您当前使用的
myScript.sh
的shell语法不同,如果您仍希望将其保存在外部文件中,您必须
执行
要求
它。但在我的原始脚本中是这样做的:导出LD_LIBRARY\u PATH=~myFolder/myFolder2:$LD_LIBRARY\u PATH在oracle的$ENV行中如何执行?您真的是指
~myFolder
??在这种情况下,
$ENV{LD_LIBRARY_PATH}=(getpwnam(“myFolder”)[7]。“/myFolder2:$ENV{LD_LIBRARY_PATH}”
。-wxS“$0”“$@”做什么?
-w
:全局警告,因为您在原始脚本中有此警告<代码>-x
:查找
#!perl
行,然后从那里开始执行
-S“$0”“$@”
:在
$PATH
中查找
$0
(当前脚本)并传递所有其他参数。实现这一点的简单方法是让myScript.sh调用perl脚本,记住传递参数。@dlamblin:这会更容易,但其中的乐趣何在?;-)这就省去了重新命名Perl脚本和添加新的shell脚本的麻烦,这一点都不重要……这个问题与您要回答的问题有点不同;将sh-then-perl作为公认的答案进行链接甚至没有含糊地暗示是可取的,因为这样做的更琐碎的方式是显而易见的,但被忽略了。可能重复:请注意,我并不一定为我对这个问题的答案感到自豪。
use Env::Modify 'source';
source("/myfolder1/myfolder2/myScript.sh");
... environment settings from myScript.sh are now available to Perl ...