http://zhumeng8337797.blog.163.com/blog/static/10076891420104215439296/
1>&2 正确返回值传递给2输出通道 &2表示2输出通道
如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.
cat x y 1> hold 2>&1
结果就是将标准+错误输出到hold;
cat x y 2>&1 1> hold
则是将错误输出重定向到标准输出,而将标准定向到hold。
所以错误输出不会进入hold,因为被定向到标准输出。
赋值关系 (1) 1 = hold , 2 = 1;
(2) 2 = 1 , 1 = hold。
明白了?呵呵
为何2>&1要写在后面?
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。
用strace可以看到:
1. command > file 2>&1
这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)
2. command 2>&1 >file
这个命令中实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)