我正在尝试在Linux中运行Perl脚本,并使用以下命令将所有输出记录到STDOUT和STDERR:
open (STDOUT, "| tee -i $transcript_file");
open (STDERR, "| tee -ai $transcript_file");
使用它的脚本大致如下:
print
,warn
和可能die
陈述。system
命令)。这会产生很多我希望出现在STDOUT上的输出,但不会出现在日志文件中(该工具会创建自己的日志文件)。print
,warn
和可能die
陈述。除了我想从日志中排除第2步的输出外,一切正常。有没有一种简单的方法来实现这一目标?
谢谢,
PS:这是我关于stackoverflow的第一个问题。如果我没有这样做,请帮我正确提问。
答案 0 :(得分:4)
我同意Sobrique建议使用特殊功能print_and_log
。但是,如果真的希望按照您的方式执行此操作,您可以dup
STDOUT
和STDERR
,将它们重定向到您的日志然后使用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)
鉴于您重新分配STDIN
和STDOUT
,简短的回答是否定的。您正在STDOUT
上捕获包含中间输出的所有
您可能会关闭/重新打开STDOUT
您想要记录的位置。
但我建议你可能想要考虑一下你想要完成的事情 - 一个&#39; print_and_log&#39;子程序做你以后的事情?