Shell 重定向 2>&1 含义说明

原文: Shell 输入/输出重定向

   hello world 参考文章

$ command > file 2>&1
$ command >> file 2>&1

这里的&没有固定的意思

放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下

1 => stdout
2 => stderr
0 => stdin

换言之 2>1 代表将stderr重定向到当前路径下文件名为1regular file中,而2>&1代表将stderr重定向到文件描述符1的文件(即/dev/stdout)中,这个文件就是stdoutfile system中的映射

&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于

>file 2>&1

此处&>或者>&视作整体,分开没有单独的含义


顺序问题:

find /etc -name .bashrc > list 2>&1
# 我想问为什么不能调下顺序,比如这样
find /etc -name .bashrc 2>&1 > list

这个是从左到右有顺序的

第一种

xxx > list 2>&1

先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list

第二种

xxx 2>&1 > list

先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响

更多解析

  Jinke2017

对于上面 '2>&1',举个例子,比如说:

$ find /etc -names "*.txt"  >list 2>&1

从左往右执行,执行到 >list,此时的 stdout 为 list;而执行到 2>&1,表示 stderr 重定向到 stdout,这里也就是 list 文件。

因为 [ find /etc -names "*.txt" ] 这条命令是错误的( -names 应该是 -name)。

本来要输出到终端屏幕的错误信息:

find: unknown predicate `-names`

被重定向到了 stdout 也就是 list 文件中,所以屏幕不会出现错误信息,而是打印到了 list 文件中。

cat list 可以查看到 find: unknown predicate `-names' 就在里面。