如何无延迟将程序输出同时重定向到屏幕和文件?
解决tee输出延迟的方法
延迟的核心原因不是tee本身,而是程序输出到管道时的缓冲策略变化:当程序直接输出到终端时,默认是行缓冲(输出一行就刷新);但输出到管道(比如| tee)时,会切换为块缓冲(攒够一定大小才输出),这才导致了延迟。下面是几种解决思路:
1. 强制程序无缓冲输出
用stdbuf命令修改程序的缓冲模式,强制输入、输出、错误流都无缓冲:
stdbuf -i0 -o0 -e0 my_executable 2>&1 | tee my_output.txt
参数说明:
-i0:输入流无缓冲-o0:标准输出无缓冲-e0:标准错误无缓冲
如果是特定语言的程序,也可以用内置参数:
- Python程序:加
-u参数,如python -u my_script.py 2>&1 | tee my_output.txt - GNU系列工具(如grep、sed):加
--line-buffered参数,强制行缓冲
2. 让tee按行缓冲输出
GNU版本的tee支持--line-buffered参数,让它每次收到一行就立即输出到终端和文件:
my_executable 2>&1 | tee --line-buffered my_output.txt
这个方法比修改程序缓冲更轻量,适合大部分场景。
3. 替代工具
如果系统里的tee不支持--line-buffered,可以用以下替代方案:
- unbuffer(来自expect工具包):模拟终端环境,让程序保持行缓冲输出:
unbuffer my_executable 2>&1 | tee my_output.txt - 自定义简单脚本:比如用Python写一个极简版无缓冲tee:
保存为#!/usr/bin/env python3 import sys with open('my_output.txt', 'ab') as f: for line in sys.stdin: sys.stdout.write(line) sys.stdout.flush() f.write(line.encode()) f.flush()unbuffered_tee.py,赋予执行权限后使用:my_executable 2>&1 | ./unbuffered_tee.py
内容的提问来源于stack exchange,提问作者Simone Morettini
相关产品推荐
相关产品推荐

