如何将某些命令的输出重定向到文件但在控制台中保留一些?

问题描述 投票:1回答:1

我使用下面的perl脚本,

open (STDOUT, '>',"log.txt")|| die "ERROR: opening log.txt\n";
print "\n inside";
close (STDOUT);
print "\noutside";

我需要字符串“inside”需要在log.txt中打印。字符串“outside”需要在控制台中打印。

但是我的脚本字符串“inside”打印在log.txt中,但字符串“outside”不会打印在控制台上。

谁可以帮我这个事

perl stdout
1个回答
2
投票

redirect the standard output streamopen STDOUT, '>', $file文件。之后,没有简单的方法可以打印到控制台。

一些打印到文件和控制台的方法

  • 在重定向之前保存STDOUT,并在需要时稍后恢复它。再次,请参阅open open SAVEOUT, ">&STDOUT" or warn "Can't dup STDOUT: $!"; open *STDOUT, ">", $logfile or warn "Can't redirect STDOUT to $logfile: $!"; say "goes to file"; ... open STDOUT, ">&SAVEOUT" or warn "Can't reopen STDOUT: $!"; # restore say "goes to console";
  • 打印到您想要控制台的变量;使用select来切换打印所在的默认值 open my $fh_so, '>', \my $for_stdout; select $fh_so; say "goes to variable \$for_stdout"; say STDOUT "goes to console"; ... select STDOUT; # make STDOUT default again say $for_stdout; # goes to console (all accumulated $fh_so prints) 有了这个你可以通过指定STDOUT到达控制台,否则一旦你select回到STDOUT你就会把所有STDOUT打印的打印出来
  • 直接将日志打印到文件中,如Jens's answer中所示 open my $fh_log, '>', $logfile or die "Can't open $logfile: $!"; say $fh_log "goes to $logfile"; say "goes to console"; ... close $fh_log; 默认的print(或者更确切地说是say)继续进入控制台

前两个看起来有点麻烦,不是吗。我建议将日志直接打印到日志文件,除非STDOUT需要重定向到大部分程序,或者你有一个令人信服的理由select文件句柄。

对于say,它为打印的内容添加了换行符,你需要在开头使用use feature 'say';

始终使用use warnings;use strict;开始您的程序。

© www.soinside.com 2019 - 2024. All rights reserved.