我寫了一個程式(用 Ruby)並且運作良好。它會列印出幾行文本,然後暫停一分鐘,然後重複上述操作。
它運作良好(在 Mac OS X 的終端機中),但我注意到,如果我想保留輸出記錄,可以使用
ruby myscript.rb | tee record.txt
那麼輸出就不會顯示在螢幕上,直到輸出達到一定的量,也許是幾 kb。然而,這可能意味著 5 或 10 分鐘螢幕上沒有任何內容(如果我按 CTRL-C,文件中也沒有任何內容)。
我可以修改程式來刷新輸出,但我認為應用程式應該不知道 STDOUT 的輸出所使用的內容。那麼可以tee
讓它很好地工作(也許有一個選項),或者可以使用任何其他命令,或者它可能是 Bash 或終端應用程式的選項?有辦法嗎?
答案1
我認為應用程式應該不知道 STDOUT 的輸出所使用的內容。
你想錯了。包括 C 和 C++ 語言在內的多種程式語言的運行時庫都共享根據是否檢測到流連接到終端設備來更改緩衝的語義。
在許多情況下,這是語言的定義部分。 C語言標準說,例如:
最初開啟時,標準錯誤流未完全緩衝;當且僅當可以確定標準輸入和標準輸出流不引用交互設備時,標準輸入和標準輸出流才會完全緩衝。
如果流未附加到終端設備,通常的選擇是選擇單元緩衝、行緩衝或完全緩衝。單元緩衝和行緩衝通常用於標準誤差;標準輸出的完全緩衝。但這確實因語言而異。
因此,當輸出流是此類語言中的管道時,要使輸出不完全緩衝,您必須
- 將程式寫入自身,使標準輸出行緩衝、智慧緩衝或無緩衝;
- 使用掛鉤特定程式語言的運行時庫的東西,例如
stdbuf
命令如果您的程式語言是 C 或使用 C 運行時庫(其中的 I/O 流部分)作為其基礎(某些程式語言不這樣做);或者 - 使用諸如
ptybandage
使程式認為其標準輸出是終端的工具,同時獲取該輸出並將其發送到管道的寫入端。
進一步閱讀
答案2
請看一下答案https://stackoverflow.com/a/11337109/5656721因為這是一個常見問題。你可以使用標準緩衝區或者解緩衝也適用於您的 ruby 程式。