做什么
把 stdin 同时输出到 stdout 和一个或多个文件——T 字形管道。
实战
ls -l | tee out.txt # 屏幕显示 + 写文件
ls -l | tee -a out.txt # 追加(不覆盖)
ls -l | tee a.txt b.txt # 写多个文件
echo "hi" | sudo tee /etc/myfile # ★ 用 sudo 写需要权限的文件
经典场景:sudo 重定向
echo "127.0.0.1 myhost" | sudo > /etc/hosts # ❌ 失败(shell 在 sudo 前开 fd)
echo "127.0.0.1 myhost" | sudo tee -a /etc/hosts # ✓ 这才行
>是 shell 处理的——sudo 不生效。tee是用 sudo 跑的进程,能写。
中间分一份不影响管道
make 2>&1 | tee build.log | grep -E "warning|error"
# 全部 → build.log
# 同时只看 warning/error 到屏幕
配文件描述符
# 把 stderr 也写文件(保持彩色)
some_cmd 2> >(tee -a stderr.log >&2)
坑
- 不加
-a默认覆盖——重要文件先备份 tee退出码总是 0(即使写文件失败)——脚本里要严格用set -o pipefail