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

时间:2017-12-18 11:25:29

标签: perl stdout

我正在使用下面的perl脚本,

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

我需要字符串"内部"需要在log.txt中打印。字符串"外部"需要在控制台中打印。

但是我的脚本字符串"内部"在log.txt中打印,但字符串"在"之外没有打印在控制台上。

任何人都可以帮助我吗

1 个答案:

答案 0 :(得分: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;启动您的计划。