2017-12-18 121 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

相關問題