10 · 输入输出重定向 🔴
目标:搞懂文件描述符 0/1/2,掌握
> >> < <<与2>&1
🎯 今天要带走的三件事
- 0 = 标准输入,1 = 标准输出,2 = 标准错误
>覆盖,>>追加;2>只重定向错误command > file 2>&1把正常输出和错误一起写进文件
一、三个标准文件描述符 ⭐
| 编号 | 名称 | 用途 |
|---|---|---|
| 0 | stdin(标准输入) | 默认从终端读 |
| 1 | stdout(标准输出) | 默认输出到终端 |
| 2 | stderr(标准错误) | 默认输出到终端 |
二、重定向命令速查
| 命令 | 说明 |
|---|---|
command > file |
输出重定向到 file(覆盖) |
command >> file |
输出追加到 file |
command < file |
输入重定向,从 file 读 |
n > file |
把文件描述符 n 重定向到 file |
n >> file |
把文件描述符 n 追加到 file |
n >& m |
输出文件 m 和 n 合并 |
n <& m |
输入文件 m 和 n 合并 |
<< tag |
Here Document,tag 之间内容作输入 |
三、输出重定向
who > users # 把 who 的输出写入 users 文件
cat users # 查看内容
echo "菜鸟教程" > users # 覆盖原内容
cat users # → 只剩一行
echo "菜鸟教程" >> users # 追加
cat users # → 两行
输出重定向后终端不再显示内容,因为输出已转到文件。
四、输入重定向
wc -l users # 输出:2 users(带文件名)
wc -l < users # 输出:2 (只是数字,不带文件名)
因为第二种只从标准输入读,不知道文件从哪来。
同时重定向输入和输出:
command1 < infile > outfile
五、错误重定向
command 2>file # stderr 重定向到 file(覆盖)
command 2>>file # stderr 追加到 file
command > file 2>&1 # stdout 和 stderr 合并到 file
command >> file 2>&1 # 追加方式合并
2表示标准错误。2和>之间不能有空格,2>是一体才表示错误输出。
六、Here Document ⭐
特殊重定向方式,把一段内容作为输入传给命令:
command << delimiter
document
delimiter
# 命令行统计行数
$ wc -l << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
3
# 脚本中使用
cat << EOF
欢迎来到
菜鸟教程
EOF
⚠️ 两条注意: - 结尾 delimiter 必须顶格写,前后不能有任何字符(含空格、tab) - 开头 delimiter 前后的空格会被忽略
七、/dev/null 黑洞文件
写入它的内容都会被丢弃,读它什么也读不到。
command > /dev/null # 屏蔽正常输出
command > /dev/null 2>&1 # 同时屏蔽 stdout 和 stderr(常用于静默执行)
常见组合速查
| 写法 | 含义 |
|---|---|
> file |
正常输出 → 文件 |
2> file |
错误输出 → 文件 |
> file 2>&1 |
正常+错误 → 文件 |
> /dev/null 2>&1 |
全部丢弃(静默) |
生活比喻
/dev/null像办公室的碎纸机:东西塞进去就没了。想「安静地运行一个命令、不想看到任何输出」,就把输出丢进碎纸机。
🌙 今日作业
- [ ] 用
>和>>分别写文件,观察差异 - [ ] 写一个一定报错的命令,分别用
2>处理,看错误去哪了
自测题
>和>>的区别?文件描述符 2 代表什么?command > file 2>&1的作用?2>&1为什么要这样写?- 想让命令完全静默,怎么写?
👉 参考答案
1. `>` 覆盖原内容,`>>` 追加。文件描述符 2 = 标准错误(stderr)。 2. 把标准输出和标准错误都重定向到 file。`2>&1` 意为「让 fd 2 指向 fd 1 当前的位置」,即错误也跟随输出走。 3. `command > /dev/null 2>&1`(丢弃 stdout 和 stderr)。🔗 关联
Shell-学习总览|上一课 → 09-函数|下一课 → 11-文件包含