摘要应包含研究目的、方法、结果和结论四要素,突出创新点,语言简洁客观,字数通常200–300字,需独立完整、自明性强,便于检索与初筛。

能直接同步输出到屏幕和文件,但默认是覆盖写入,且标准错误不会自动包含——必须显式重定向才能捕获 stderr。
tee 基本用法:为什么 ls | tee file.txt 能同时看到屏幕输出又存文件
因为 tee 本质是「分流器」:它从 stdin 读一行,立刻往 stdout 写一份(即终端显示),再往每个指定文件写一份。不缓存整段输出,所以实时性好。
- 默认行为是覆盖写入,已有同名文件会被清空重写
- 如果管道上游命令崩溃或被 Ctrl+C 中断,
tee可能只写入部分数据(取决于缓冲状态) - 终端窗口缩放、颜色控制序列(如
\033[32m)会原样写入文件,可能让文件内容带乱码 - 示例:
ls -l | tee file_list.txt—— 屏幕显示完整列表,file_list.txt内容与之完全一致
捕获标准错误:make 2>&1 | tee build.log 为什么必须写 2>&1
Shell 默认只把 stdout 接入管道,stderr 仍直连终端。不加 2>&1,tee 根本收不到编译错误,build.log 里只有正常输出,报错全丢在屏幕上。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
2>&1表示“把文件描述符 2(stderr)重定向到当前的 fd 1(stdout)”,此时两者都进管道 - 顺序很重要:
command 2>&1 | tee file正确;command | tee file 2>&1错误——后者只重定向了tee自己的 stderr - 若需区分 stdout/stderr 到不同文件,
tee不适用,得用script或重定向组合
追加写入与多目标写入:-a 和多个文件名的实际效果
-a 选项让 tee 对每个目标文件都用 O_APPEND 标志打开,避免竞态覆盖;多个文件名则触发并行写入,各文件内容完全一致。
-
echo "log line" | tee -a app.log→ 追加一行,不破坏原有日志 -
date | tee timestamp1.txt timestamp2.txt→ 两个文件同时获得相同时间戳 - 注意:如果某个文件因权限不足无法写入,
tee仍会继续写其他文件,但最终返回非零退出码($?不为 0) - 没有内置机制保证多个文件写入原子性或一致性,不要依赖它们“绝对同步”
权限不足时用 :w!sudo tee % 保存 Vim 修改,底层发生了什么
这其实是利用 tee 的进程上下文切换能力:Vim 以普通用户运行,但 sudo tee 是 root 权限进程,能绕过文件写权限检查。
-
%是 Vim 内置变量,代表当前编辑的文件路径 - Vim 执行
:w !sudo tee %时,把缓冲区内容通过 stdin 传给sudo tee /path/to/file - 关键点:root 权限的
tee覆盖写入文件,而普通用户 Vim 无需修改文件权限或 chown - 风险:如果文件属主不是 root,且设置了不可删除位(如
chattr +a),仍可能失败
真正容易被忽略的是缓冲行为:当输入源是交互式命令(比如 tail -f)或短小输出时,tee 通常表现“实时”;但若上游产生大量数据且未换行,glibc 的行缓冲可能延迟输出,导致屏幕和文件看起来不同步——这不是 tee 的 bug,而是整个管道链的缓冲策略问题。










