我限制使用的 perl 版本是 v5.10.0;
我有一个脚本“script1”需要调用另一个脚本“script2”。
为了绕过 shell 并避免命令行注入,我在 perl 中使用“open”来执行此操作。
open(my $fh, "-|", "/path/to/script2", "-n", "$param") 或者说 "failure $@";
我无法修改 script2。
我需要将 stderr 的输出从 script2 获取到 script1 中的变量中。
我得到了“-|” 语法来自https://perldoc.perl.org/functions/open.html但这里的描述主要是一个如何做的例子,而不是它在做什么,所以我不知道如何将 err 重定向到 out 或甚至至少将 err 重定向到其他一些变量。
我希望看起来类似于这两个选项之一的东西:
# option 1)
open(my $fh, "-|", "/path/to/script2", "-n", "$param") or say "failure $@";
while($line = <$fh>) { # stderr and stdout are both fed to $line
print $line;
}
# option 2)
open(STDERR, "+<", $stderr);
open(my $fh, "-|", "/path/to/script2", "-n", "$param") or say "failure $@";
while($line = <$fh>) { #stdout is fed to $line
print $line;
}
while($line = <$stderr>) { #stderr from script2 is fed to $line
print $line;
}
我会使用IPC::Run3
:
use strict;
use warnings;
use IPC::Run3;
run3 ['script2.pl', '-n', $param], undef, \my $out, \my $err;
这将为您提供script2.pl
变量中的 STDERR $err
。
从文档:
run3($cmd, $stdin, $stdout, $stderr, \%options)
$cmd 之后的所有参数都是可选的。
参数 $stdin、$stdout 和 $stderr 指示子项的相应文件句柄(STDIN、STDOUT 和 STDERR,分别)将如何重定向。因为重定向在最后,这允许 STDOUT 和 STDERR 通过不指定它们来默认为父级——这是一个常见的用例。
$cmd
通常 $cmd 将是一个 ARRAY 引用,并且通过调用子项
system @$cmd;
请注意,$cmd
作为数组引用传递将避免在与命令相同的条件下通过 shell 运行system()
命令
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句