【linux命令】数据流重定向
数据流重定向
命令:
$ command > file 2>&1
$ command >> file 2>&1
这里的&没有固定的意思。放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符说明如下:
换言之 2>1
代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1
代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射。而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于
>file 2>&1
此处&>或者>&视作整体,分开没有单独的含义。
xxx > /dev/null 2>&1
对于&1
更准确的说应该是文件描述符 1, j即标准输出stout;2为标准文件描述符2,即错误输出sterr。2>&1
的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null,可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到。
cat /etc/crontab /etc/notexist > /dev/null 2>&1
可以理解为左边是标准输出,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。
举例说明:
命令 | 含义 |
ls 2>1 | 不会报没有2文件的错误,但会输出一个空的文件1 |
ls ctdb.log 2>1 | 没有ctdb.log这个文件的错误输出到了1中 |
ls ctdb.log 2>&1 | 不会生成1这个文件了,不过错误跑到标准输出了 |
ls ctdb.log > /dev/null 2>&1 | 实际可以换成:ls ctdb.log 1> /dev/null 2>&1,重定向符号>默认是1 |