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 |
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(注意顺序:先指向文件,再合并)。