10 · 输入输出重定向 🔴

2026.10.08 · 🔴

目标:搞懂文件描述符 0/1/2,掌握 > >> < << 与 2>&1

🎯 今天要带走的三件事

  1. 0 = 标准输入,1 = 标准输出,2 = 标准错误
  2. > 覆盖,>> 追加;2> 只重定向错误
  3. 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> 处理,看错误去哪了

自测题

  1. > 和 >> 的区别?文件描述符 2 代表什么?
  2. command > file 2>&1 的作用?2>&1 为什么要这样写?
  3. 想让命令完全静默,怎么写?
👉 参考答案 1. `>` 覆盖原内容,`>>` 追加。文件描述符 2 = 标准错误(stderr)。 2. 把标准输出和标准错误都重定向到 file。`2>&1` 意为「让 fd 2 指向 fd 1 当前的位置」,即错误也跟随输出走。 3. `command > /dev/null 2>&1`(丢弃 stdout 和 stderr)。

🔗 关联

Shell-学习总览|上一课 → 09-函数|下一课 → 11-文件包含