标准流
Linux 程序默认有3个标准流:
stdout标准输出(屏幕,编号1)stderr标准错误输出(屏幕,编号2)stdin标准输入(键盘,编号0)
输出重定向
把本来打印到屏幕的内容,转到文件里,而不是终端。
>覆盖写入(先清空文件,再写内容)>>追加写入(在文件末尾新增内容,不覆盖原有内容)
1. > 覆盖重定向(截断输出)
语法:
命令 > 文件名
特点:
- 如果文件不存在:自动新建文件
- 如果文件已存在:直接清空原有全部内容,再写入命令输出
⚠️ 风险:容易误删文件内容!
示例
# 将ls的结果写入test.txt,覆盖原有内容
ls -l > test.txt
# 清空一个文件(常用小技巧,把空输出覆盖进去)
> test.txt
2. >> 追加重定向(追加输出)
语法:
命令 >> 文件名
特点:
- 文件不存在:新建
- 文件存在:在文件末尾添加内容,原有内容保留
示例
# 第一次写入
echo "第一行" >> log.txt
# 继续追加一行,不会删掉第一行
echo "第二行" >> log.txt
3. 标准错误 stderr 重定向
> 默认只重定向标准输出stdout,报错信息(stderr)仍然打印屏幕。
2>:错误覆盖2>>:错误追加
# 把错误信息覆盖写入err.log,正常输出依旧屏幕
cat nofile.txt 2> err.log
# 错误追加到err.log
cat nofile.txt 2>> err.log
4. 同时把正常输出+错误输出写到同一个文件
# 方式1(推荐,bash)
命令 > all.log 2>&1
# 方式2(简写,新版bash支持)
命令 &> all.log
2>&1含义:把2号错误流,重定向到1号输出流的目标
5. 常用组合示例
# 1. 输出到文件,屏幕不显示
echo hello > a.txt
# 2. 多次追加日志
date >> run.log
echo "执行完毕" >> run.log
# 3. 屏蔽所有输出(丢进黑洞 /dev/null)
command > /dev/null 2>&1
6. 容易踩坑的要点
- 重定向符号位置:符号后面跟文件名,不能放命令参数中间
# ✅ echo abc > file.txt # ❌ 错误 echo > file.txt abc >清空文件是打开文件那一刻就清空,不是命令执行完。echo输出默认自带换行;echo -n不换行写入。- 权限问题:如果当前用户没有文件所在目录写入权限,会报
Permission denied。
7. 对比总结表
| 符号 | 名称 | 作用 | 文件存在时 |
|---|---|---|---|
> |
覆盖重定向 | stdout写入文件 | 清空原有内容 |
>> |
追加重定向 | stdout写入文件末尾 | 保留原有内容,末尾新增 |
2> |
错误覆盖 | stderr写入文件 | 清空 |
2>> |
错误追加 | stderr写入文件末尾 | 追加 |
&> |
全部输出覆盖 | stdout+stderr一起写入 | 清空 |