---
title: "Linux/Unix Shell 重定向操作符与文件描述符"
description: "Shell 中文件描述符 0/1/2 的含义、重定向操作符 > / >> / 2>&1 等语法，以及 /dev/null /dev/tty 等特殊目标的速查。"
date: "2026-08-14"
type: "notes"
kind: "note"
tags:
  - shell
  - bash
  - linux
  - 重定向
  - 文件描述符
draft: false
---

Linux/Unix Shell（Bash、Zsh 等）中的 **`2>`**、**`&1`** 等写法涉及文件描述符编号和重定向语法。按数字值、操作符组合、目标位置分类速查。

### 1. 标准文件描述符（数字值）

| 数字值 | 名称 | 符号常量 | 说明 |
| :--- | :--- | :--- | :--- |
| **0** | 标准输入（stdin） | `STDIN_FILENO` | 默认从键盘读取，常与 `<` 搭配 |
| **1** | 标准输出（stdout） | `STDOUT_FILENO` | 默认输出到屏幕，正常日志/结果 |
| **2** | 标准错误（stderr） | `STDERR_FILENO` | 默认输出到屏幕，错误和警告信息 |

> 文件描述符 `3`~`9` 也可自定义使用，日常脚本中极不常用，一般留给特殊场景。

### 2. 重定向操作符组合

| 写法 | 含义 | 等价说明 |
| :--- | :--- | :--- |
| `> file` 或 `1> file` | 标准输出重定向到文件（覆盖） | 不包含错误信息 |
| `>> file` 或 `1>> file` | 标准输出重定向到文件（追加） | 不包含错误信息 |
| `2> file` | 标准错误重定向到文件（覆盖） | 不包含正常输出 |
| `2>> file` | 标准错误重定向到文件（追加） | 不包含正常输出 |
| `&> file` 或 `>& file` | 标准输出和标准错误同时重定向到文件（覆盖） | Bash 快捷写法，等同 `> file 2>&1` |
| `&>> file` | 标准输出和标准错误同时重定向到文件（追加） | Bash 快捷写法 |

### 3. 文件描述符绑定与复用（`&` 用法）

| 写法 | 含义 | 说明 |
| :--- | :--- | :--- |
| `2>&1` | 标准错误合并到标准输出当前指向的位置 | 让错误和输出流到同一地方 |
| `1>&2` | 标准输出合并到标准错误当前指向的位置 | 常用于把正常信息伪装成错误输出 |
| `>&2` | 等价于 `1>&2`（简写形式） | 将标准输出送到 stderr |
| `|&` | 管道符变种（`cmd1 |& cmd2`） | 将 cmd1 的 stdout 和 stderr 都传给 cmd2（Bash 4.0+） |

### 4. 特殊目标位置

| 目标位置 | 含义 | 用途 |
| :--- | :--- | :--- |
| `/dev/null` | 空设备（黑洞） | 丢弃所有写入的数据，读取返回 EOF。忽略不需要的输出 |
| `/dev/tty` | 当前终端设备 | 强制输出到当前用户的屏幕，即使 stdout 被重定向 |
| `/dev/stdout` | 指向标准输出（1） | 等价于 `/proc/self/fd/1`，很少直接这么用 |
| `/dev/stderr` | 指向标准错误（2） | 等价于 `/proc/self/fd/2` |
| `&-` | 关闭文件描述符 | 如 `2>&-` 关闭标准错误（`/dev/null` 更安全） |

### 记忆口诀

- **0** 是键盘进，**1** 是正常出，**2** 是错误出；
- **`>`** 是覆盖，**`>>`** 是追加；
- **`&`** 后面跟数字表示"拷贝/指向"那个数字所代表的流（`2>&1` 就是"把 2 的指向改成和 1 一样"）；
- 想全都要用 **`&>`**，想扔掉用 **`> /dev/null 2>&1`**（注意顺序：先指向文件，再合并）。
