Linux 输入输出重定向
maiaimei 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
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
# 错误重定向 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
📌 记忆口诀:
>是写,>>是加,<是读,2>是错,|是传,tee是两边。