Tr

我可以禁用 tr 的緩衝嗎

  • February 19, 2018

tr似乎緩衝了它的輸入,因此這個命令LongRunningCommand|tr \\n ,只有在 LongRunningCommand 的輸入積累了幾千字節後才會開始產生輸出。

有沒有辦法強制tr停止此緩衝或任何其他可以用其他字元替換換行符而不緩衝的命令?


PS 我已經嘗試過關閉管道中的緩衝但沒有成功的前兩個建議。

命令通常不會緩衝它們的輸入。他們會read()為一個大塊做一個,但是當從管道中讀取時,如果管道中沒有那麼多字節,read()系統呼叫將返回盡可能多的字元,如果可以的話,應用程序通常會使用它.

一個值得注意的例外是mawk它會一直保持read()直到輸入緩衝區滿為止。

不過,應用程序確實緩衝了它們的輸出(stdout)。通常的行為是,如果輸出到一個 tty,那麼緩衝將是逐行的(也就是說,它不會開始寫入 stdout,直到它有一個完整的行輸出,或者一個塊滿的非常長線),而對於其他所有類型的文件,緩衝是按塊進行的(也就是說,它不會開始寫入,直到有一個塊已滿(例如 4KiB/8KiB ……取決於軟體和系統) ))。

因此,在您的情況下,LongRunningCommand可能會按塊緩衝其輸出(因為它的輸出是管道而不是 tty),並且tr可能會按行緩衝其輸出,因為它的輸出可能是終端。

但是,由於您從其輸出中刪除每個換行符,它永遠不會輸出一行,因此緩衝將按塊進行。

因此,您要在此處禁用LongRunningCommand和的緩衝tr。在 GNU 或 FreeBSD 系統上:

stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,

請注意,如果您想用逗號連接行,更好的方法是使用paste -sd , -. 這樣輸出將由換行符終止(您可能仍需要禁用緩衝)。

引用自:https://unix.stackexchange.com/questions/238995