Perl의 시스템 호출에 대한 표준 출력 파일 핸들을 어떻게 변경하려면?

StackOverflow https://stackoverflow.com/questions/990913

  •  13-09-2019
  •  | 
  •  

문제

Select를 사용하여 시스템 기능의 STDOUT를 변경하려고합니다. 그러나 그것은 작동하지 않는 것 같습니다. 시스템 출력이 파일로 리디렉션되지 않고 콘솔에 표시됩니다.

use strict;
use warnings;

chdir "C:\\Documents and Settings\\" or die "cannot open the dir\n";
open FH, ">out.txt" or die "cannot open out.txt\n";
select FH or die " cannot change the stdout\n";
system "dir /a" ; 

내가 할 수는 있지만 system "dir /a > out.txt", 위의 코드가 왜 작동하지 않는지 알고 싶습니다.

도움이 되었습니까?

해결책

그만큼 select 함수는 출력에 대한 기본 파일 핸들을 변경합니다. 그것은 stdout을 변경하지 않으며, 이는 출력의 기본 파일 핸들인지 여부에 관계없이 포인트를 가리 킵니다. stdout을 변경하려면 Ylebre 또는 Jon의 대답과 같은 일을해야합니다.

자식 프로세스를 시작하면 부모와 동일한 표준 출력을 얻습니다. 부모의 기본 파일 핸들이 무엇인지는 신경 쓰지 않습니다.

다른 팁

코드의 문제는 그 것입니다 system 명령은 귀하를 위해 출력을 캡처하지 않습니다. 당신이 사용할 수있는 qx//:

use strict;
use warnings;

open my $fh, ">", "output.txt" or die $!;
my $oldfh= select $fh;
print qx/ls -a/;
select $oldfh;
close $fh or warn $!;

외부 응용 프로그램을 실행하고 읽기 출력을 얻는 다른 옵션이 있습니다. IPC::Open2 그리고 IPC::Open3 모듈. 기본적으로 Perl에 포함되어 있습니다.

부수적 참고 : 파일 핸들에 Globs를 사용하지 마십시오. 글로벌이며 글로벌은 사악합니다. 대신 어휘 변수를 사용합니다 (FH vs. $fh). 또한 세 가지 인수를 사용해야합니다 open 전자는 후자보다 안전하기 때문에 두 매개 변수 대신.

아마도 이것 도움이됩니다

이 경우 'select'가 당신이 찾고있는 것인지 잘 모르겠습니다. stdout을 파일로 리디렉션하려면 다음을 수행 할 수 있습니다.

use strict;
use warnings;
use IO::Handle;
open FH, "> out.txt";
STDOUT->fdopen( \*FH, 'w' ) or die $!;
print "Hello world!\n";
system "dir /a";

도움이 되었기를 바랍니다!

시스템 (Perl) 레벨에서 파일 디스크립터를 재 할당합니다.

    sub reopen($$$) {
        open $_[0], $_[1]. '&='. fileno($_[2]) or die "failed to reopen: $!";
    }

    reopen *STDOUT,  '>', $new_stdout_handle;

이제 포크가 $ new_stdout_handle이 표준 출력이라고 생각할 것입니다.

나는 GIST에 대한 전체 예를 붙여 넣었습니다. http://gist.github.com/129407

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top