为什么 shell 管道输出被截断?

为什么 shell 管道输出被截断?

我在 macOS Catalina 上安装了 Visual Studio Code。我试图将 的输出通过管道传输code --telemetryjq以便于阅读,但失败了。这让我发现管道在 1674 行后被截断。这是什么原因造成的?管道在使用 的第二个示例中工作正常cat,所以我猜想 一定有什么独特之处code

$ code --telemetry | wc
    1674    3006   65536

$ code --telemetry > output.json
$ cat output.json | wc
    7530   13462  302261

答案1

这是因为管道局限性。

在 Linux 手册页 pipe(7) 中,它说管道容量​​为 65536 字节(16 个系统页,每个页 4096 字节),换句话说,管道缓冲区只能收集 ​​65536 个字符。

这里有一篇很棒的文章向您展示如何扩展管道缓冲区。

编辑 :

这里的问题来自于代码命令 :

冲洗标准输出应该在退出之前完成,这里发生的事情是管道未被告知数据结束,因此管道将只取第一个 65536 字节的块(缓冲区大小),然后认为流已结束,然后只将第一个块写入标准输出

您可以在此处报告此问题

相关内容