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

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

export LD_LIBRARY_PATH=.... 

我想在我的Perl脚本中运行这个脚本,这样任何运行我的Perl脚本的人都将设置它们的LD_LIBRARY_PATH 。 我可以在我的Perl脚本的开始执行此操作:

 #!/usr/bin/perl -w system(". /myfolder1/myfolder2/myScript.sh"); 

 #!/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加载到本地环境中。 然后exec Perl的Perl,这是告诉继续从下面的行。

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

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

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

但是你可以让你的脚本使用你想要设置的字符串作为LD_LIBRARY_PATH,然后在你的Perl脚本中你可以这样做:

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

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

不可以。您在小孩所做的环境变化不会影响父母。 这意味着运行脚本不会影响perl。 而且perl也不会影响它被调用的shell。 您可以通过更改特殊变量 %ENV来编辑perl内部的%ENV 。 如果在脚本中有一些不可重复的计算,那么脚本应该只是echo显设置,perl可以在STDOUT并使用它。

我{更改了目录,修改了我的环境}在perl脚本中。 当我退出剧本的时候,这个变化怎么会消失? 我如何使我的更改可见?

Unix从最严格的意义上说,它是不能完成的 – 脚本作为与从其开始的shell不同的进程来执行。 对进程的更改不会反映在其父项中,只会在更改后创建的自己的子项中反映。

几年前,我也遇到了一个类似的问题,并且掀起了一个小模块, Env :: Sourced ,应该这样做。

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

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

 use MyEnvironment; 

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

模块本身会很简单,就像这样:

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

这是行不通的。 一个(不愉快的)替代方案可能是用一个shell脚本替换/ usr / bin / perl,该脚本首先执行脚本,然后执行perl可执行文件。

这不能以你试图这样做的方式完成。

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

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

注意:你还没有提供任何有关可能运行的环境或useres的信息,所以用户也可能会将LD_LIBRARY_PATH设置为他们需要的东西。 如果您在脚本中检查LD_LIBRARY_PATH以获得“良好”的值,请记住可能已经指定了多个路径,因此您需要正确解析该环境变量。

如果你可以在你的perl脚本中找到正确的地方,就像我的例子一样:

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

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

Env::Modify模块解决了这个问题,至少在POSIX-y平台上是这样的:

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