我有一个脚本,其内容只是在 linux 中导出一个变量。
export LD_LIBRARY_PATH=....
我想在我的 Perl 脚本中运行这个脚本,这样运行我的 Perl 脚本的人就会有他们的LD_LIBRARY_PATH
设置。我可以在我的 Perl 脚本的开头这样做吗:
#!/usr/bin/perl -w
system(". /myfolder1/myfolder2/myScript.sh");
我有一个脚本,其内容只是在 linux 中导出一个变量。
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
到本地环境中的 执行。 sh
然后exec
是 s 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 中的环境。如果在该脚本中进行了某种不可重现的计算,也许脚本应该只是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;
那是行不通的。一个(不愉快的)替代方法可能是将 /usr/bin/perl 替换为 shell 脚本,该脚本首先执行您的脚本,然后执行 perl 可执行文件。
这不能以您尝试执行此操作的方式完成。
它要么需要一个包装器 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
在脚本中检查了“好”值,请记住可能已指定多个路径,因此您需要正确解析此环境变量。
如果你能在你的 perl 脚本中找到正确的位置,这就像我的例子一样:
$ENV{"LD_LIBRARY_PATH"} = "/oracle/product/10g/lib";
它不需要我调用另一个脚本来设置环境变量。
该Env::Modify
模块解决了这个问题,至少对于 POSIX-y 平台:
use Env::Modify 'source';
source("/myfolder1/myfolder2/myScript.sh");
... environment settings from myScript.sh are now available to Perl ...