Linux 输入输出重定向

2026/11/8 Linux

# 数据流

Linux 每个程序有 3 个默认数据流:

编号 名称 含义 例子
0 stdin 标准输入 键盘输入
1 stdout 标准输出 命令正常结果
2 stderr 标准错误 报错信息

# 符号说明

符号 含义
< 输入重定向:从文件读,而不是键盘
> 输出重定向:覆盖写入文件
>> 输出追加重定向:追加到文件末尾
2> 错误输出重定向
2>&1 把错误合并到正常输出(把文件描述符 2(stderr)重定向到文件描述符 1(stdout)当前指向的地方。)
&> 所有输出(正常+错误)一起重定向
| 管道:把一个命令的输出传给另一个命令
tee 一边显示一边保存

# 常用写法

写法 含义
命令 > file 正常输出写入文件(覆盖)
命令 >> file 正常输出追加到文件
命令 2> file 错误信息写入文件(覆盖)
命令 2>> file 错误信息追加到文件
命令 > file 2>&1 正常+错误都写入文件(覆盖)
命令 &> file 正常+错误都写入文件(覆盖),bash 简写
命令 > /dev/null 隐藏正常输出
命令 2> /dev/null 隐藏错误输出
命令 > /dev/null 2>&1 所有输出都隐藏(静默执行)

/dev/null 是Linux 里的"黑洞设备"——写进去的东西直接消失,永远读不到。

# 输入重定向 <

# 从文件读取内容作为命令输入
grep "root" < /etc/passwd

# 统计文件行数
wc -l < file.txt

# 多个命令从同一文件读(heredoc)
command << EOF
输入内容
EOF
1
2
3
4
5
6
7
8
9
10

<< EOF 是 Here Document( heredoc ),意思是:把一段文字直接"写"给命令,当作它的输入。

部分 含义
<< 告诉 shell:"接下来是一段多行输入"
EOF 自定义的分隔标记(可以是任意词)
中间的内容 实际传给命令的输入
结尾的 EOF 告诉 shell "输入到此结束"

EOF 可以换成别的词,只要开头和结尾标记一致就行。常见写法:

标记 风格
EOF 最常用(End Of File 缩写)
END 简洁
EOL End Of Line
MARKER 随意

# 输出重定向 > 和 >>

ls > list.txt          # 把 ls 结果写入 list.txt(覆盖原内容)
ls >> list.txt         # 追加到 list.txt 末尾
1
2

# 错误重定向 2>

find / -name "nginx.conf" 2>/dev/null   # 搜索时隐藏权限报错
1

# 合并输出 2>&1

command > output.log 2>&1    # 正常和错误信息都进 output.log
1

# 管道 |

ps aux | grep nginx          # 把 ps 输出传给 grep 过滤
1

# tee:既显示又保存

ls | tee list.txt            # 屏幕显示 ls 结果,同时写入 list.txt
ls | tee -a list.txt         # 追加模式
1
2

📌 记忆口诀:> 是写,>> 是加,< 是读,2> 是错,| 是传,tee 是两边。