2>&1

2>&1
基本含义:
0:stdin
1:stdout
2:stderr

标准错误重定向到标准输出,&?
&指等效于标准输出

cmd>a 2>a 和 cmd>a 2>&1的区别
cmd>a 2>a:产生的标准输入重定向到文件a,标准错误也重定向到a,会打开两次文件a,导致stdout会被stderr覆盖

&1可以理解为标准输出的引用,这个引用就是stdout产生打开的a,从io效率来看比不带&的要高
而cmd>a 2>&1:只打开1次文件a,在这一次打开的文件a中追加内容

e.g.

//test.sh
#!/bin/sh
t
date

执行bash test.sh>res1.log

发现stderr没有被写入文件,而是被打印到屏幕
所以bash test.sh > res1.log 等价于 bash test.sh 1>res1.log

执行bash test.sh>res2.log 2>&1
屏幕没有报错, stdout和stderr都被重定向到res2.log中

command >out.file 2>&1 & //相当于ctrl - z
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。
为何2>&1要写在后面?

为何2>&1要写在后面?
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

tee command

将命令输出内容写入文件,供后续参考
从标准输入中复制到每一个文件,并输出到标准输出e.g. ping google.com | tee output.txt
确保tee命令追加信息到文件中e.g. tee -a [file]
让tee写入多个文件e.g. [command] | tee [file1] [file2]

cmd_list.append('2>&1 | tee {}/log_import.txt'.format(self.log_output))

2>&1:标准错误重定向到标准输出,即log文件也会记录运行错误产生的输出信息

posted @ 2019-04-09 14:29  开心大人  阅读(212)  评论(0编辑  收藏  举报