2012-09-03 65 views
4

我需要從我的Perl腳本執行一個命令,這需要一段時間(1-2小時)。我希望能夠看到命令的輸出,以便我的腳本可以檢查一切正常,但由於需要很長時間,我希望用戶在運行時也能看到命令輸出。Perl執行命令,捕獲和顯示輸出

我已經試過:

  • backticks - 當命令完成
  • system只能得到輸出 - 當命令完成
  • open只能得到輸出 - 近乎完美 - 但命令輸出被緩衝,這意味着用戶很長一段時間沒有看到更新。互聯網是充滿了建議設置$| = 1但顯然這隻會影響輸入緩衝並不起作用
  • 管道到tee - 類似結果open - 「三通」似乎只打印後
  • 重新定向輸出和使用Proc::BackgroundFile::Tail - 幾乎完美再次,但想不到一個優雅的方式來停止打印循環

很想有一個建議!


編輯:我已經接受巴馬爾的回答。我相信這是有效的,因爲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設置爲真值會禁用當前選擇文件句柄的緩衝。這與你所要求的有什麼不同? – TLP

+0

TLP,正如我所說的那樣,而且似乎沒有奏效。經過研究,我發現autoflush隻影響輸入緩衝。 – Frederik

回答

2

使用Expect.pm應在命令禁用輸出緩衝。

+0

似乎精美的工作,並有一個優雅的實施。謝謝! – Frederik