4
我需要從我的Perl腳本執行一個命令,這需要一段時間(1-2小時)。我希望能夠看到命令的輸出,以便我的腳本可以檢查一切正常,但由於需要很長時間,我希望用戶在運行時也能看到命令輸出。Perl執行命令,捕獲和顯示輸出
我已經試過:
backticks
- 當命令完成system
只能得到輸出 - 當命令完成open
只能得到輸出 - 近乎完美 - 但命令輸出被緩衝,這意味着用戶很長一段時間沒有看到更新。互聯網是充滿了建議設置$| = 1
但顯然這隻會影響輸入緩衝並不起作用- 管道到
tee
- 類似結果open
- 「三通」似乎只打印後 - 重新定向輸出和使用
Proc::Background
和File::Tail
- 幾乎完美再次,但想不到一個優雅的方式來停止打印循環
很想有一個建議!
編輯:我已經接受巴馬爾的回答。我相信這是有效的,因爲Expect.pm使用僞終端。只是給別人看在未來這個問題,這是怎麼了,我實現它:
my $process = Expect->spawn($command, @params) or die "Cannot spawn $command: $!\n";
while ($process->expect(undef))
{
print $process->before();
}
看看http://stackoverflow.com/a/214005/1331451 – simbabque
將autoflush設置爲真值會禁用當前選擇文件句柄的緩衝。這與你所要求的有什麼不同? – TLP
TLP,正如我所說的那樣,而且似乎沒有奏效。經過研究,我發現autoflush隻影響輸入緩衝。 – Frederik