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

时间:2009-10-19 20:26:18

标签: linux perl environment

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

export LD_LIBRARY_PATH=....

我想在我的Perl脚本中运行此脚本,因此无论谁运行我的Perl脚本,都会设置LD_LIBRARY_PATH。我可以在Perl脚本的开头执行此操作:

#!/usr/bin/perl -w

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

10 个答案:

答案 0 :(得分:10)

#!/bin/sh
. /myfolder1/myfolder2/myScript.sh
exec perl -wxS "$0" "$@"
#!/usr/bin/perl -w
# .. the rest of your script as normal

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

这不起作用。子shell无法操纵父进程的环境。

但是你可以让你的脚本回显你想要设置为LD_LIBRARY_PATH的字符串,然后在你的Perl脚本中你可以做类似的事情:

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

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

答案 3 :(得分:2)

没有。您在孩子中进行的环境更改不会影响父级。这意味着运行脚本不会影响perl。 perl也不会影响调用它的shell。您可以通过更改special variable %ENV来修改perl内的环境。如果在该脚本中进行了某种不可重复的计算,那么脚本应该echo设置和perl可以在STDOUT上选择并使用它。

  

I {changed directory, modified my environment} in a perl script. How come the change disappeared when I exited the script? How do I get my changes to be visible?

     

Unix 从最严格的意义上讲,它无法完成 - 脚本会执行   作为与shell不同的过程   它是从...开始的。改变了   过程没有反映在其中   父母,只在自己的孩子身上   改变后创建。

答案 4 :(得分:2)

几年前我遇到了一个类似的问题,掀起了一个小模块Env::Sourced,应该可以解决这个问题。

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

...

答案 5 :(得分:1)

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

use MyEnvironment;

并在所有脚本中修改您的环境。在不需要编辑每个脚本的事实之后,可以很容易地进行更改。

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

package MyEnvironment;

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

1;

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这不能按照您尝试这样做的方式完成。

它需要一个设置LD_LIBRARY_PATH的包装器shell脚本,然后调用你的perl脚本,或者执行脚本的任何用户都需要首先正确设置LD_LIBRARY_PATH

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

注意:您尚未提供有关可能运行此操作的环境或用途的任何信息,因此用户也可能将LD_LIBRARY_PATH设置为他们需要的内容。如果您在脚本中检查LD_LIBRARY_PATH是否有“好”值,请记住可能已指定了几个路径,因此您需要正确解析此环境变量。

答案 8 :(得分:0)

如果你能在你的perl脚本中找到合适的位置,这就像我的例子一样:

$ENV{"LD_LIBRARY_PATH"} = "/oracle/product/10g/lib";

并且它不需要我调用另一个脚本来设置env var。

答案 9 :(得分:0)

Env::Modify模块解决了这个问题,至少对于POSIX-y平台来说是这样的:

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