What does 2>&1 mean?

看到一句命令如下,

shell> docker logs mysql1 2>&1 | grep GENERATED

意思是将docker容器中的日志输出并且只输出包含”GENERATED”的行,突然发现对2>&1这个写法还不是很了解,于是查了资料大概了解下。

文件操作符以及重定向符号

在unix或者linux系统中,有3种文件操作符(File Descriptor )

ameShort NameFile Descriptor NumberDescription
Standard Instdin0Keyboard Input
Standard Outstdout1Console Output
Standard Errorstderr2Console Error Output

这里只讨论1和2, 1表示标准输出,2表示标准错误输出, 2>&1 中的 > 则是重定向符号。

执行以下命令将something(可以是一个文本文件,也可以是其他类型文件)的内容重定向到result.txt文件中:

cat something > result.txt

以上命令实际是 cat something 1> result.txt 的缩写,即省略了表示标准输出的1。

那么我们如果执行以下命令,cat一个不存在的文件,并将结果重定向到result.txt文件,会出现什么情况呢?

cat something_not_exist > result.txt

结果是终端显示错误信息: cat: something_not_exist: No such file or directory

因为上面的输出是错误输出,因此错误信息并没有重定向到result.txt。如果在>符号前添加2后再执行,可以发现错误信息被重定向到result.txt中了。

cat something_not_exist 2> result.txt

但如果上面操作的是存在的文件,那么命令执行后,文件的内容显示到终端上了,并没有重定向到result.txt中。

当我们希望无论是标准输出还是错误输出都重定向到result.txt中时,该怎么写呢?那就是使用2>&1这样的写法:

cat something something_not_exist > result.txt 2>&1

也可以使用以下写法:

cat something something_not_exist &> result.txt

其他说明

  • cat something — 直接将something的内容输出到终端
  • cat something >> result.txt — 将something的内容追加到result.txt文件中
  • cat something something_not_exist 2>&1 | grep abc — 这样是OK的
  • cat something something_not_exist &> | grep abc — 这样是不行的

问题

2>&1是什么意思上面大概清楚了,留下2个问题思考加深印象:

  1. 1>&2又是什么意思,跟2>&1有什么区别,该如何使用?
  2. 这里&符号是什么意思,为什么有这个符号?

.

.

.

.

.

.

.

.

.

.

.

.

  1. 2>&1 说明前面要重定向的是普通输出,但是如果有错误输出的话,也跟普通输出放一起,1>&2 则说明前面要重定向的是错误输出,但是有普通输出的话,也跟错误重定向到相同的地方,使用方法从下面命令来看会清晰一些:
    • cat something > result.txt 2>&1
    • cat something 2> result.txt 1>&2
  2. & 符号 stackoverflow有个解释,或许可以参考下
    • At first, 2>1 may look like a good way to redirect stderr to stdout. However, it will actually be interpreted as “redirect stderr to a file named 1“.
    • & indicates that what follows and precedes is a file descriptor, and not a filename. Thus, we use 2>&1. Consider >& to be a redirect merger operator.

参考资料