Linux 在Perl中修改子进程的环境
我不确定这为什么不起作用,但也许我把事情简单化了/复杂化了 我正在编写一个最终需要调用外部程序的Perl脚本。问题是,此程序需要修改Linux 在Perl中修改子进程的环境,linux,perl,ipc,Linux,Perl,Ipc,我不确定这为什么不起作用,但也许我把事情简单化了/复杂化了 我正在编写一个最终需要调用外部程序的Perl脚本。问题是,此程序需要修改LD_LIBRARY_PATH环境变量的版本,以便找到供应商未在标准位置安装的两个库 好的,环境在%ENV中,可以重写,是吗 我想如果我在父对象中更改LD_LIBRARY_PATH,会影响子对象的动态链接 因此,我: use Env qw(@LD_LIBRARY_PATH); use IPC::System::Simple qw(capturex $EXITVAL)
LD_LIBRARY_PATH
环境变量的版本,以便找到供应商未在标准位置安装的两个库
好的,环境在%ENV
中,可以重写,是吗
我想如果我在父对象中更改LD_LIBRARY_PATH
,会影响子对象的动态链接
因此,我:
use Env qw(@LD_LIBRARY_PATH);
use IPC::System::Simple qw(capturex $EXITVAL);
# We need these to establish the call to rsq later
my ($rsqexe, $rsqhome, $suffix) = fileparse($config->rsq());
push @LD_LIBRARY_PATH, $rsqhome;
eval {
$output = capturex(
$config->rsq(),
qq/"$source"/
);
};
但是子进程死亡,并出现一个错误,指示无法找到共享库
我该如何改进这一点
成功执行后,我确实需要检查$output
的内容
eval {
$output = capturex(
$config->rsq(),
qq/"$source"/
);
};
问题是:我没有检查$@
(或者$EVAL\u ERR
如果你使用英语;
)
如果我这样做了,我会发现问题出在引用
qq/“$source”/
——因为capturex()
不调用shell(这是所需的行为),引号会破坏文件名(即test.pdf
存在,但test.pdf
不存在).尝试使用转储$LD\u LIBRARY\u PATH内容的包装器包装您试图执行的程序。将未知问题分成两部分。如果您没有看到希望看到的$LD_LIBRARY_路径,可以朝一个方向看。如果您看到的是正确的$LD_LIBRARY_路径,但您的包装器无论如何都无法执行程序,那么您将转向另一个方向。感谢您的建议-您的方法揭示了真正的问题(毕竟LD_LIBRARY_路径根本不存在),对,应该是capturex($config->rsq(),$source)
。使用capturex
的全部目的是避免使用shell
或像qq/“$source”/
这样的错误报价解决方案。