一篇文章看懂linux的2>$1

2 > $1

今天看到群里有人在问这个问题,我这里恰好没有写文章。所以这里整理一下。

1在文件里面是标准输出,stdout
2是标准错误输出。stderr
0是标准输入,stdin

这里必须得有演示,否则很多人看不懂。

guo@jia:~$ ls
1  Desktop  Documents  Downloads

我执行ls之后,下面查找出来的就是标准输出。

这种情况是正常查询的情况,那如果错误查询了呢?
这里我查一个不存在的文件,hhh

guo@jia:~$ ls hhh
ls: cannot access 'hhh': No such file or directory

这里能看到的是,报错了。报错的信息同样输出在下面。这个就是标准错误输出了。

正常情况下,标准输出和标准错误输出都会输出到命令行界面。但是看日志的时候,会很不方便,因为如果这样的话,没法找到报错信息了。解决办法就是2>&1.为什么?

下面继续举例子:

guo@jia:~$ ls > 1
guo@jia:~$ 

这个时候没有报错,而且,我们的家目录下面会多一个文件,1. 打开之后,就是当前的文件目录。

这说明,ls的标准输出输出到了1文件中。
guo@jia:~$ ls hhh > 1
ls: cannot access 'hhh': No such file or directory

这个时候报错了,hhh没有找到这个文件,但是1这个文件被创建了。里面什么也没有。

这说明了,ls的标准错误输出没有输出到1文件中。

再来最后一个例子

guo@jia:~$ ls hhh > 1 2>&1
guo@jia:~$ 

这种情况没有报错,打开文件1,我们发现里面有一条记录。没有文件1的报错信息。

这说明了,ls的标准错误输出成功的被重定向到了文件1中。

但是应该怎么理解这个语句呢?我先来一段定义,先看一下规则,然后我再解释。

2.重定向的使用规律

标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个
标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&
文件描述符与重定向符号之间不能有空格

这里的重定向符号就是>, 而这里的文件描述符号就是0,1,2. 如果在重定向的左侧的时候,可以直接写0,1,2.
否则得加&。

这里来深入看一下。 ls hhh > 1 2>&1 到底是什么意思?

首先标准错误输出会重定向到标准输出里面,因为标准输出已经被重定向到了1这个文件当中,所以最终标准错误输出也被重定向到1文件当中。
当然,你也可以分别重定向到1这个文件当中。这里不再举例。

猜你喜欢

转载自blog.csdn.net/funnyPython/article/details/83859508