tr
似乎要缓冲其输入,以便该命令LongRunningCommand|tr \\n ,
仅在LongRunningCommand积累了几千字节的输入后才开始产生输出。
有没有一种方法可以强制tr
停止此缓冲,或者可以使用其他字符替换新行而不进行缓冲的任何其他命令?
PS我已经尝试了关闭管道中的缓冲而没有成功的前两个建议。
命令通常不缓冲其输入。他们会read()
为很大的块做一个a,但是当从管道中读取时,如果管道中没有那么多字节,read()
系统调用将返回包含所有字符的字符,并且如果可以的话,应用程序通常会与之一起使用。
值得注意的例外是mawk
它将一直保持read()
到输入缓冲区已满为止。
应用程序确实会缓冲其输出(stdout)。通常的行为是,如果输出要发送到tty,则缓冲将是逐行的(也就是说,直到有完整的行要输出时才开始向stdout写入,或者对于完全长行),而对于其他所有类型的文件,缓冲都是按块进行的(也就是说,直到有一个完整的块要写入时才会开始写入(类似于4KiB / 8KiB ...取决于软件和系统) ))。
因此,在您的情况下,LongRunningCommand
可能会按块缓冲其输出(因为它的输出是管道而不是tty),并且tr
可能会按行缓冲其输出,因为它的输出可能是终端。
但是,由于您从输出的每个换行符中删除了该字符,它将永远不会输出一行,因此缓冲将按块进行。
因此,在这里您想同时为LongRunningCommand
和禁用缓冲tr
。在GNU或FreeBSD系统上:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
请注意,如果您想用逗号将各行连接起来,则最好使用paste -sd , -
。这样,输出将以换行符终止(您可能仍需要禁用缓冲)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句