tr似乎缓冲其输入,以便此命令LongRunningCommand|tr \\n ,仅在来自 LongRunningCommand 的输入积累了几千字节后才开始产生输出。
有没有办法强制tr停止此缓冲或任何其他可以在没有缓冲的情况下用其他字符替换换行符的命令?
PS 我已经尝试了关闭管道中的缓冲的前两个建议,但没有成功。
Sté*_*las 13
命令通常不缓冲它们的输入。他们会read()为一个大块做一个,但是当从管道中读取时,如果管道中没有那么多字节,read()系统调用将返回尽可能多的字符,如果可以的话,应用程序通常会使用它.
一个值得注意的例外是mawk它会一直重复read()直到输入缓冲区已满。
不过,应用程序确实会缓冲其输出(stdout)。通常的行为是,如果输出是一个 tty,那么缓冲将是逐行的(也就是说,它不会开始写入 stdout,直到它有一个完整的行要输出,或者一个块满长行),而对于其他类型的文件,缓冲是按块(也就是说,它不会开始写入,直到有一个块要写入为止(例如 4KiB/8KiB……取决于软件和系统) ))。
因此,在您的情况下,LongRunningCommand可能会按块缓冲其输出(因为它的输出是管道而不是 tty),并且tr可能按行缓冲其输出,因为其输出可能是终端。
但是,由于您从其输出中删除了每个换行符,它永远不会输出一行,因此缓冲将按块进行。
所以在这里要为两禁用缓存LongRunningCommand和tr。在 GNU 或 FreeBSD 系统上:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Run Code Online (Sandbox Code Playgroud)
请注意,如果您想用逗号连接行,更好的方法是使用paste -sd , -. 这样,输出将以换行符终止(您可能仍需要禁用缓冲)。
要用 替换换行符",",您可以运行
awk '{ printf "%s,", $0 }'
Run Code Online (Sandbox Code Playgroud)
GNU awk ( gawk) 和 Solarisnawk将在 stdin 上使用行缓冲运行,而在输出到终端时不使用缓冲 stdout。如果您的 awk 是mawk,这发生在 Ubuntu 上,您可以为其-W interactive提供获得相同缓冲行为的选项。
| 归档时间: |
|
| 查看次数: |
2823 次 |
| 最近记录: |