首页 > 解决方案 > Perl 脚本在不使用 Capture::Tiny 模块的情况下捕获标准错误消息

问题描述

我在使用 perl 中的 backticks 命令say 'make target' 捕获 stderr 消息时遇到问题。因此,我使用了 Capture::Tiny 模块来捕获标准错误消息。但是我在安装它时遇到了问题,并且想知道使用此模块以外的其他方法。

如果您知道,请告诉我。

问候, 普尔尼玛

标签: perl

解决方案


perldoc perlop

因为反引号不影响标准错误,所以如果您想解决这个问题,请使用 shell 文件描述符语法(假设 shell 支持这一点)。一起捕获命令的 STDERR 和 STDOUT:

$output = `cmd 2>&1`; 

要捕获命令的 STDOUT 但丢弃其 STDERR:

$output = `cmd 2>/dev/null`; 

要捕获命令的 STDERR 但丢弃其 STDOUT(此处排序很重要):

$output = `cmd 2>&1 1>/dev/null`; 

交换命令的 STDOUT 和 STDERR 以捕获 STDERR 但将其 STDOUT 保留为旧的 STDERR:

$output = `cmd 3>&1 1>&2 2>&3 3>&-`; 

要分别读取命令的 STDOUT 和 STDERR,最简单的方法是将它们分别重定向到文件,然后在程序完成时从这些文件中读取:

system("program args 1>program.stdout 2>program.stderr");

推荐阅读