2011-03-04 39 views
1

此問題可能與Emacs無關,但與所有使用Console進行調試過程的開發環境無關。這是問題。我使用Eshell來運行我們正在開發的應用程序。這是一個J2ME應用程序。而對於調試,我們只使用System.out.println()。現在,假設我只允許在控制檯中顯示以Eko:開頭的文本(交互式),有可能嗎?如何僅允許在Emacs控制檯上打印某些文本?

我在我的Windows環境下安裝了Cygwin,並嘗試grep這樣的輸出: run | grep Eko:。它確實只以Eko:作爲開始,過濾輸出,但它不是交互式的。輸出壓縮,直到應用程序退出。那麼,無論如何,這是無用的。

是否可以做到這一點?我的意思是,我們不必觸摸應用程序代碼本身?

我也標記到Linux,因爲也許Linux中的一些人知道答案。

非常感謝!

回答

1

簡而言之:嘗試將--line-buffered添加到您的grep命令中。

長:我假設你的應用程序正在刷新其輸出流,每System.out.println(),而grep有可用線路立即讀取,但選擇緩衝輸出,直到它有足夠的輸出保存起來,使寫作合理。 (這通常是4k或8k的數據,可能是幾百行,具體取決於你的行長度。)

當輸出是管道中的另一個程序時,這種緩衝很有意義;減少不必要的上下文切換是提高程序吞吐量的好方法。

但是,如果您的打印速度足夠慢,導致其不能足夠快速地爲「實時」輸出填充緩衝區,則切換到行緩衝輸出可能會修復該問題。

+0

非常好! 還有一個非常詳細的解釋... 非常感謝。這在這裏會幫助我們很多。謝謝 – swdev 2011-03-04 04:19:52

+0

順便說一句,我只是在DOS命令窗口中測試沒有'-line-buffered'的'grep'。有用。那麼,爲什麼我們需要在Emacs Shell中使用'--line-buffered',而不是在DOS命令窗口中?我很抱歉,如果在你的解釋中你已經解釋了它。我只是有時間去了解它:) 非常感謝 – swdev 2011-03-04 04:32:07

+1

@swdev:以終端作爲輸出,標準C庫將'stdout' stdio流設置爲行緩衝。但是,當'stdout'流設置爲管道(因爲我想它是在Emacs緩衝區中),那麼C庫將執行塊緩衝。默認是在文件描述符上調用'fstat(2)',併爲緩衝區使用'st_blksize'字節。這通常是4k或8k,但其他值也是可能的。 'setvbuf(3)'手冊頁包含所有細節。 :) – sarnold 2011-03-04 04:37:35