看到一句命令如下,
shell> docker logs mysql1 2>&1 | grep GENERATED
意思是将docker容器中的日志输出并且只输出包含”GENERATED”的行,突然发现对2>&1这个写法还不是很了解,于是查了资料大概了解下。
文件操作符以及重定向符号
在unix或者linux系统中,有3种文件操作符(File Descriptor )
ame | Short Name | File Descriptor Number | Description |
---|---|---|---|
Standard In | stdin | 0 | Keyboard Input |
Standard Out | stdout | 1 | Console Output |
Standard Error | stderr | 2 | Console 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>&2又是什么意思,跟2>&1有什么区别,该如何使用?
- 这里&符号是什么意思,为什么有这个符号?
.
.
.
.
.
.
.
.
.
.
.
.
- 2>&1 说明前面要重定向的是普通输出,但是如果有错误输出的话,也跟普通输出放一起,1>&2 则说明前面要重定向的是错误输出,但是有普通输出的话,也跟错误重定向到相同的地方,使用方法从下面命令来看会清晰一些:
- cat something > result.txt 2>&1
- cat something 2> result.txt 1>&2
- & 符号 stackoverflow有个解释,或许可以参考下
- At first,
2>1
may look like a good way to redirectstderr
tostdout
. However, it will actually be interpreted as “redirectstderr
to a file named1
“. &
indicates that what follows and precedes is a file descriptor, and not a filename. Thus, we use2>&1
. Consider>&
to be a redirect merger operator.
- At first,