Tr
我可以禁用 tr 的緩衝嗎
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 , -
. 這樣輸出將由換行符終止(您可能仍需要禁用緩衝)。