【问题标题】:Perl catching STDERR and STDOUT of subprocessPerl 捕获子进程的 STDERR 和 STDOUT
【发布时间】:2020-06-23 10:42:52
【问题描述】:

我有执行另一个脚本的 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;
} 

【问题讨论】:

  • system 不会抛出异常(除非您替换它,例如使用 autodie),因此 eval 不会做太多事情

标签: shell perl stdout system-calls stderr


【解决方案1】:

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

此外,将 Perl 脚本 CONNECTION.pl 更改为模块并从您的脚本中use 它可能更简洁,而不是再次调用 perl。

【讨论】:

  • 您可以通过使用IPC::Run 来避免system(正如您最初暗示的C::T 允许您这样做)。它不如 C::T 捕获输出灵活,但在运行程序和与它们交互(包括捕获它们的输出)方面比 C::T 更灵活。
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多