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这个文件当中。这里不再举例。