我在 macOS Catalina 上安装了 Visual Studio Code。我试图将 的输出通过管道传输code --telemetry
到jq
以便于阅读,但失败了。这让我发现管道在 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 字节的块(缓冲区大小),然后认为流已结束,然后只将第一个块写入标准输出。