paste命令重定向周期性输入无输出:原因排查与解决方法
问题原因与修复方案
为什么代码无输出?
paste 命令默认对管道输入使用全缓冲机制:它会把输入数据暂存到缓冲区,直到缓冲区被填满(通常是几千字节)才会一次性输出内容。你的循环每秒只输出一行"test",远达不到缓冲区的触发阈值,所以内容一直被卡在缓冲区里,看不到输出。
而换成 cat 能正常工作,是因为 cat 对管道输入默认使用行缓冲,每收到一行就立刻输出;把 sleep 1 改成 sleep 0 时,输出速度极快,瞬间填满缓冲区,paste 就会一次性吐出所有内容。
修复方法
使用 stdbuf 命令强制 paste 采用行缓冲模式,这样每收到一行就会立即输出:
stdbuf -oL paste <(while :; do echo "test"; sleep 1; done) | cat
-oL参数表示将标准输出设置为行缓冲。
如果需要合并多个类似的周期性输出,只需要在 paste 后添加更多进程替换的输入即可,比如:
stdbuf -oL paste <(while :; do echo "test1"; sleep 1; done) <(while :; do echo "test2"; sleep 2; done) | cat
内容的提问来源于stack exchange,提问作者vbstb
相关产品推荐
相关产品推荐

