将STDOUT和STDERR重定向到文件,系统的标准输出/错误除外()

时间:2015-02-06 11:30:37

标签: perl io-redirection

我正在尝试在Linux中运行Perl脚本,并使用以下命令将所有输出记录到STDOUT和STDERR:

open (STDOUT, "| tee -i $transcript_file");
open (STDERR, "| tee -ai $transcript_file");

使用它的脚本大致如下:

  1. 创建用于运行工具的环境。有很多printwarn和可能die陈述。
  2. 运行该工具(目前正在使用system命令)。这会产生很多我希望出现在STDOUT上的输出,但不会出现在日志文件中(该工具会创建自己的日志文件)。
  3. 分析结果,清理并退出。有很多printwarn和可能die陈述。
  4. 除了我想从日志中排除第2步的输出外,一切正常。有没有一种简单的方法来实现这一目标?

    谢谢,

    PS:这是我关于stackoverflow的第一个问题。如果我没有这样做,请帮我正确提问。

2 个答案:

答案 0 :(得分:4)

我同意Sobrique建议使用特殊功能print_and_log。但是,如果真的希望按照您的方式执行此操作,您可以dup STDOUTSTDERR,将它们重定向到您的日志然后使用open3使用复制的原始标准输出和错误文件描述符

运行您的工具
use  IPC::Open3;

# dup the old standard output and error 
open(OLDOUT, ">&STDOUT") or die "Can't dup STDOUT: $!\n";
open(OLDERR, ">&STDERR") or die "Can't dup STDERR: $!\n";

# reopen stdout and stderr
open (STDOUT, "|tee $transcript_file") or die "Can't reopen STDOUT: $!\n";
open (STDERR, ">&STDOUT")              or die "Can't reopen STDERR: $!\n";

# print statements now write to log
print "Logging important info: blah!\n";
print STDERR "OOPS!\n";

# run your command; output will go to original stdout
# this will die() instead of returning say -1, so use eval() to catch errors
my $pid = open3(">&OLDOUT", "<&STDIN", ">&OLDERR", $command); 

# wash those dishes....
waitpid( $pid, 0 );

答案 1 :(得分:0)

鉴于您重新分配STDINSTDOUT,简短的回答是否定的。您正在STDOUT上捕获包含中间输出的所有

您可能会关闭/重新打开STDOUT您想要记录的位置。 但我建议你可能想要考虑一下你想要完成的事情 - 一个&#39; print_and_log&#39;子程序做你以后的事情?