Perl 捕获子进程的 STDERR 和 STDOUT

Jan*_*i86 2 shell perl stdout system-calls stderr

我有正在执行另一个脚本的 Perl 脚本。如何确保在CONNECTION.pl执行时捕获 STDERR 和 STDOUT,以便将其放入父脚本的日志中?波纹管是来自父脚本的代码:

my $systemcmd ='perl bin/CONNECTION.pl "'.$expanded_sql.'" "'.$tmp_file.'" "'.$fetch.'"';

eval {
  my $rc = system($systemcmd );
};

if ($@) {
  $errmsg = $@;
  croak {message=>$errmsg};
  unlink $tmp_file;
} 
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 8

尝试使用Capture::Tiny包装对system的调用。

此外,将 Perl 脚本 CONNECTION.pl 更改为模块并从脚本中使用它可能会更清晰,而不是再次调用 perl。

  • 您可以通过使用 [IPC::Run](https://metacpan.org/pod/IPC::Run) 来避免“system”(正如您最初暗示 C::T 允许您这样做的那样)。它不如 C::T 那样灵活地捕获输出,但在运行程序并与程序交互(包括捕获其输出)时,它比 C::T 更灵活。 (3认同)