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

1. 标准文件描述符(数字值)

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

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

2. 重定向操作符组合

写法含义等价说明
> file1> file标准输出重定向到文件(覆盖)不包含错误信息
>> file1>> 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(注意顺序:先指向文件,再合并)。