仅重定向标准输出(stdout),不捕获错误(stderr);覆盖写入会清空文件;>>追加需确保命令真有stdout输出;tee可分发输出但需注意退出码和语法。

直接用 > 或 >> 就能保存,但多数人卡在错误没存进去、追加失效、或想看屏幕又想存文件这三件事上。
用 > 覆盖写入时,为什么文件内容“消失了”或“不是我想要的”
因为 > 只捕获标准输出(stdout),不抓错误信息(stderr)。比如 ls /nonexistent > out.txt,终端显示 No such file or directory,但 out.txt 是空的——错误被扔到终端了,没进文件。
- 要同时保存成功输出和报错,必须显式合并 stderr:用
ls /nonexistent > out.txt 2>&1或更简洁的ls /nonexistent &> out.txt -
>总是清空原文件再写,哪怕命令执行失败(比如权限不足),文件也会被截断为空——这是很多脚本出 bug 的根源 - 路径含空格或特殊字符时,务必给文件名加引号:
ls > "my output.txt",否则 shell 会拆分解析
用 >> 追加时,为什么新内容没出现在末尾
常见原因是误用了 > 覆盖了刚写的内容,或者命令本身没输出(比如静默失败、输出被重定向到 stderr)。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
>>确实只往文件末尾追加,但前提是命令真有 stdout 输出;检查是否该加2>&1把错误也带上 - 某些命令(如
curl -I)默认只输出 header,没 body,看起来像“没输出”,其实它输出了——用curl -I https://example.com >> log.txt是有效的 - 如果目标文件被其他进程独占写入(如日志轮转中),
>>可能因权限或锁失败,但不会报错,需配合set -o pipefail或检查$?判断是否真写入成功
想一边看终端输出、一边存文件,tee 怎么用才不翻车
tee 是唯一能“分发”输出的命令,但新手常忽略它的退出码和中断行为。
- 基础用法:
ls | tee output.txt—— 终端显示 + 写入文件(覆盖) - 追加用
-a:date | tee -a log.txt - 关键细节:
tee只要任一输出目标(终端或文件)写失败,就返回非零退出码;但默认不中断管道,所以前序命令仍会执行完。需要严格判断时,加set -e或显式检查$? - 不要写成
ls > | tee file.txt——>后面不能跟管道,语法错误
curl 输出保存的几个硬坑
curl 自带 -o,但和 shell 重定向混用容易冲突,且默认不处理 HTTP 错误码。
- 用
curl -o file.txt https://api.example.com最省事,但注意:HTTP 404/500 时,file.txt仍会被创建(内容是错误页),而$?返回 0 —— 需加-f让它对非 2xx 返回非零:curl -f -o file.txt https://api.example.com - 若要用重定向(比如想合并 stderr),别用
-o:curl https://api.example.com > file.txt 2>&1 - 下载二进制文件(如图片、tar.gz)时,避免用
tee,因为它可能破坏二进制流;优先用-o或纯重定向
真正麻烦的从来不是“怎么存”,而是“存下来的东西是否可信”:有没有漏 stderr?是否被截断?命令失败了但文件却生成了空内容?这些点不确认,日志就只是幻觉。










