【问题标题】:How to redirect output of some commands to a file but keep some in the console?如何将某些命令的输出重定向到文件但将一些命令保留在控制台中?
【发布时间】:2017-12-23 01:33:20
【问题描述】:

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

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

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

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

谁能帮我解决这个问题

【问题讨论】:

    标签: perl stdout


    【解决方案1】:

    redirect the standard output stream 到一个带有 open 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; 启动您的程序。

    【讨论】:

    • 谢谢,我从来不知道你可以重定向 STDOUT。令我震惊的是,从技术上讲,您仍然可以使用 warn 打印到控制台
    • @beasy 背景的标准文档之一是I/O redirection (bash)。但请注意,模块使这更容易。例如,我很容易找到this postthis post
    • @beasy 确实。警告转到 STDERR,一个不同的流 (fd 2)。该流确实会出现在控制台上,除非它也被重定向。当我为程序重定向 STDOUT 时,我通常也会重定向 STDERR(以完全相同的方式),并且通常重定向到不同的文件。这是因为这些程序在无人看管的情况下运行,没有 cron 或其他工具,我需要它们的所有输出在文件中。然后程序最终可以检查 STDERR 文件是否为 emtpy,如果不是,它会向我发送一封电子邮件,警告我有错误(否则它会删除文件)。
    猜你喜欢
    • 2014-09-05
    • 2020-01-21
    • 1970-01-01
    • 2014-03-27
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多