我有一个脚本,其内容只是在linux中导出一个变量。
export LD_LIBRARY_PATH=....
我想在我的Perl脚本中运行此脚本,因此无论谁运行我的Perl脚本,都会设置LD_LIBRARY_PATH
。我可以在Perl脚本的开头执行此操作:
#!/usr/bin/perl -w
system(". /myfolder1/myfolder2/myScript.sh");
答案 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
上选择并使用它。
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 ...