tee命令可同时将标准输出显示在屏幕并写入文件,支持覆盖(默认)、追加(-a)、多文件写入及stderr合并(2>&1),还可配合sudo绕过权限限制。

直接用 tee 命令就能实现——它天生就是干这个的:从管道接收标准输出(stdout),一份原样送到终端屏幕,另一份同步写进指定文件。
基础写法:边看边存
最常用形式是:命令 | tee 文件名
例如:
-
ls -l | tee file_list.txt:终端显示详细列表,同时完整保存到file_list.txt -
ping -c 4 baidu.com | tee ping_result.txt:实时看到 ping 过程,结果也落盘可查
注意:默认会覆盖同名文件。如果想保留旧内容,加 -a 参数即可。
必须捕获错误输出(stderr)
很多命令出错时信息走的是 stderr,而 tee 默认只处理 stdout。不重定向的话,屏幕上能看到报错,但文件里空空如也。
正确做法是把 stderr 合并进 stdout 再交给 tee:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
make 2>&1 | tee build.log:编译过程和所有错误都进日志 -
./deploy.sh 2>&1 | tee -a deploy.log:追加记录每次部署的完整输出
顺序不能错:2>&1 必须写在 | tee 前面;写成 | tee 2>&1 是无效的。
多文件备份与权限绕过
tee 支持一次写多个目标文件,空格分隔:
-
date | tee timestamp.log /tmp/timestamp.bak:同一时间戳同步存两处 -
dmesg | tee kernel.log /var/log/backup/dmesg_$(date +%s).log:带时间戳的双备份
还能绕过权限限制写系统文件:
-
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf:非 root 用户也能安全修改配置 - Vim 里遇到
E212: Can't open file for writing,可用:w !sudo tee %强制保存
脚本中要注意退出状态
管道中用 | tee 后,$? 返回的是 tee 的状态(通常为 0),不是上游命令的真实结果。这会导致脚本误判成功。
获取原始命令退出码要靠 PIPESTATUS:
some_command 2>&1 | tee log.txt; exit_code=${PIPESTATUS[0]}- 后续可用
if (( exit_code != 0 )); then ...做准确判断

















