4

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

export LD_LIBRARY_PATH=....

我想在我的 Perl 脚本中运行这个脚本,这样运行我的 Perl 脚本的人就会有他们的LD_LIBRARY_PATH设置。我可以在我的 Perl 脚本的开头这样做吗:

#!/usr/bin/perl -w

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

10 回答 10

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是 s Perl,它被告知从下一行继续。

于 2009-10-19T20:33:35.823 回答
5

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

$ENV{"LD_LIBRARY_PATH"} = ... ;
于 2009-10-19T20:30:49.727 回答
4

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

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

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

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

于 2009-10-19T20:28:49.220 回答
2

不会。您在子项中所做的环境更改不会影响父项。这意味着运行脚本不会影响 perl。perl 也不会影响调用它的 shell。您可以通过更改特殊变量 %ENV来编辑 perl 中的环境。如果在该脚本中进行了某种不可重现的计算,也许脚本应该只是echo设置,perl 可以选择STDOUT并使用它。

我在 perl 脚本中{更改了目录,修改了我的环境}。当我退出脚本时,更改为什么消失了?如何让我的更改可见?

Unix 从最严格的意义上说,它是做不到的——脚本作为与它启动时所在的 shell 不同的进程执行。对流程的更改不会反映在其父进程中,只会反映在更改后创建的自己的子进程中。

于 2009-10-19T20:52:55.287 回答
2

几年前我也遇到过类似的问题,于是开发了一个小模块Env::Sourced,它应该可以解决问题。

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

...

于 2009-10-19T23:36:46.197 回答
1

另一种选择(除了直接在 Perl%ENV中进行更改)是进行您想要的 Perl 模块的更改,这样您就可以说:

use MyEnvironment;

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

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

package MyEnvironment;

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

1;
于 2009-10-19T20:44:47.327 回答
0

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

于 2009-10-19T20:29:04.867 回答
0

这不能以您尝试执行此操作的方式完成。

它要么需要一个包装器 shell 脚本来设置LD_LIBRARY_PATH然后调用你的 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在脚本中检查了“好”值,请记住可能已指定多个路径,因此您需要正确解析此环境变量。

于 2009-10-19T20:36:15.040 回答
0

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

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

它不需要我调用另一个脚本来设置环境变量。

于 2009-11-13T22:16:19.923 回答
0

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

use Env::Modify 'source';
source("/myfolder1/myfolder2/myScript.sh");
... environment settings from myScript.sh are now available to Perl ...
于 2017-01-30T16:06:07.960 回答