2012-09-03 10 views
4

필자의 펄 스크립트에서 명령을 실행해야하는데, 시간이 좀 걸릴 것입니다 (1-2 시간). 나는 명령의 출력을 볼 수 있기를 원한다. 그래서 내 스크립트는 모든 것이 제대로되었는지를 확인할 수있다. 그러나 오랜 시간이 걸리므로, 사용자는 실행 중에 명령 출력을 보길 원한다.Perl 명령 실행, 캡쳐 및 출력 출력

나는 시도했다 :

  • backticks - 명령이
  • system
  • 을 완료 한 경우에만 출력을 얻을 수 - 명령이
  • open
  • 을 완료 한 경우에만 출력을 얻을 수 - 거의 완벽한 -하지만 명령 출력이 버퍼링되므로 사용자가 오랫동안 업데이트를 보지 못합니다. open에 유사한 결과 - - 제안 $| = 1을 설정하지만 분명히 이것은 단지 입력 버퍼링에 영향을 미치고
  • 배관 tee에 작동하지 않습니다 인터넷이 가득 '티'는 나중에
  • 다시 감독 출력과 Proc::Background를 사용하여 인쇄하는 것 File::Tail - 다시 거의 완벽하지만 인쇄를 중단하는 우아한 방법을 생각할 수 없습니다.

제안 하시길 바랍니다.


편집 : Barmars 답변을 수락했습니다. 나는 Expect.pm이 가상 터미널을 사용하기 때문에 작동한다고 믿는다. 그냥 다른 사람들이 미래에이 질문을보고, 이것은 내가 그것을 구현 한 방법입니다 Expect.pm를 사용

my $process = Expect->spawn($command, @params) or die "Cannot spawn $command: $!\n"; 

while ($process->expect(undef)) 
{ 
    print $process->before(); 
} 
+2

http://stackoverflow.com/a/214005/1331451 – simbabque

+0

autoflush를 true로 설정하면 현재 '선택'된 파일 핸들에 대한 버퍼링이 비활성화됩니다. 당신이 요구하는 것과 다른 점은 무엇입니까? – TLP

+0

TLP, 내가 말했듯이, 그것을 시도하고, 그것은 작동하지 않았다. 이를 연구 할 때 autoflush는 입력 버퍼링에만 영향을 미친다는 것을 알았습니다. – Frederik

답변

2

명령에 출력 버퍼링을 비활성화해야합니다.

+0

아름답게 작동하고 우아한 구현이 있습니다. 감사! – Frederik