2017-12-18 27 views
1

,일부 명령의 출력을 파일로 리디렉션하지만 콘솔에 일부 명령을 유지하는 방법은 무엇입니까? 내가 펄 스크립트 이하로 사용하고

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

내가 "내부"문자열이 필요 log.txt에 안에 인쇄 될 필요가있다. "outside"문자열을 콘솔에 인쇄해야합니다.

내 스크립트 문자열 "inside"는 log.txt 안에 인쇄되지만 "outside"문자열은 콘솔에 인쇄되지 않습니다.

사람은 open STDOUT, '>', $file 가진 파일이

+0

코드에'use warnings;'을 추가하면 경고 메시지가 나타납니다. – toolic

+0

Stackoverflow에 오신 것을 환영합니다. [누군가 내 질문에 대답하면 어떻게해야합니까?] (http://stackoverflow.com/help/someone-answers)를 참조하십시오. [도움말 페이지] (https://stackoverflow.com/help)를 둘러보십시오. 그리고 명확. 게시 된 답변에 대해 궁금한 점이 있으면 대면 할 것이고 사람들은 정상적으로 응답하고 명확하게 설명합니다. – zdim

답변

2

당신 redirect the standard output stream에 나를 도울 수 있습니다. 그 후 콘솔에 인쇄하는 간단한 방법은 없습니다.

어떤 방법으로 리디렉션하기 전에 파일 및 콘솔

  • 저장 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 다시 STDOUT

  • 인쇄 모든 STDOUT 의도 인쇄를 둘 것, 인쇄 당신이 STDOUT를 지정하여 콘솔에 도달 할 수 있습니다 이것으로

    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) 
    

    를 이동하는 위치에 대한 기본을 전환 할 select를 사용 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 (또는 오히려에서와 같이 직접 파일에 로그,210 위) 콘솔에 계속 간다

처음 두 개는 약간 성가시다. 을 프로그램의 대부분으로 리디렉션하지 않거나 select 파일 핸들을 사용해야하는 특별한 이유가없는 한 로그를 로그 파일에 직접 인쇄하는 것이 좋습니다.

인쇄 할 줄 바꿈을 추가하는 의 경우 처음에는 use feature 'say';이 필요합니다.

항상 use warnings;use strict;으로 프로그램을 시작하십시오.

+0

감사합니다. STDOUT을 (를) 리디렉션 할 수 있다는 것을 알지 못했습니다. – beasy

+1

@beasy 이것에 대한 배경 지식을 가진 표준 문서 중 하나는 [I/O redirection (bash)]이다. (http://tldp.org/LDP /abs/html/io-redirection.html). 그러나 모듈을 사용하면 훨씬 쉽습니다. 예를 들어 [this post] (https://stackoverflow.com/a/47045913/4653379)와 [this post] (https : // stackoverflow.co.kr/a/43501427/4653379) – zdim

+0

@beasy 사실. 경고는 STDERR, 다른 스트림 (fd 2)으로 이동합니다. 그 스트림은 리디렉션되지 않으면 콘솔에서 나옵니다. STDOUT을 프로그램 리다이렉션했을 때 STDERR (똑같은 방식으로)과 보통 다른 파일로 리다이렉트한다. 이러한 프로그램은 cron이나 다른 도구에서 무인으로 실행되기 때문에 이러한 파일을 모두 출력해야하기 때문입니다. 그런 다음 프로그램은 STDERR 파일이 emtpy인지 여부를 최종적으로 확인할 수 있습니다. 그렇지 않은 경우 오류가 있음을 경고하는 전자 메일을 나에게 보냅니다 (그렇지 않으면 파일을 삭제합니다). – zdim