做什么

把 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