2017-12-18 225 views
1

我使用下面的perl脚本,如何将某些命令的输出重定向到文件,但将某些命令保留在控制台中?

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

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

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

任何人都可以帮助我在此

+0

将'使用警告'添加到您的代码中,您将收到警告消息。 – toolic

+0

欢迎来到Stackoverflow。请参阅[当某人回答我的问题时该怎么办?](http://stackoverflow.com/help/someone-answers)并查看[帮助页面](https://stackoverflow.com/help),它很短并且清楚。如果您对发布的答案有疑问,那么预计会发表意见,人们通常会回复并澄清事情。 – zdim

回答

2

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到达控制台中的默认,否则你会拿出所有标准输出,打算打印一旦你selectSTDOUT

  • 打印日志直接文件,如在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,或者您有一个令人信服的理由来处理文件句柄。

对于say,它为打印的内容添加换行符,您需要在开始处使用use feature 'say';。请致电use warnings;use strict;

+0

谢谢,我从来不知道你可以重定向STDOUT。技术上说,你仍然可以使用'warn'来打印到控制台,虽然 – beasy

+1

@beasy其中一个背景标准文档是[I/O redirection(bash)](http://tldp.org/LDP /abs/html/io-redirection.html)。但请注意,模块使这更容易。例如,我可以随时找到[本文](https://stackoverflow.com/a/47045913/4653379)和[本文](https:// stackoverflow。com/a/43501427/4653379) – zdim

+0

@beasy确实。警告去STDERR,一个不同的流(fd 2)。除非重定向,否则该流在控制台上出现。当我将STDOUT重定向到某个程序时,我通常也将STDERR重定向(以完全相同的方式),并且通常将其重定向到不同的文件。这是因为这些程序无人值守,无法使用cron或其他工具,而且我需要将它们的所有输出保存在文件中。然后,程序可以检查STDERR文件是否为空,如果不是,则会向我发送一封电子邮件,警告我存在错误(否则会删除文件)。 – zdim

相关问题