Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Perl中修改子进程的环境_Linux_Perl_Ipc - Fatal编程技术网

Linux 在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)

我不确定这为什么不起作用,但也许我把事情简单化了/复杂化了

我正在编写一个最终需要调用外部程序的Perl脚本。问题是,此程序需要修改
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”/
这样的错误报价解决方案。