首页 > 代码库 > ls you no 2>&1 1>&2|egrep \* >file 和 (ls you no 2>&1) 1>&2|egrep \* >file 执行结果不一样

ls you no 2>&1 1>&2|egrep \* >file 和 (ls you no 2>&1) 1>&2|egrep \* >file 执行结果不一样

1、ls you no 2>&1 1>&2|egrep \* >file
2、(ls you no 2>&1) 1>&2|egrep \* >file

谁shell比较熟悉,这个脚本,为什么执行结果不一样?

 

回答群友问题

 

1、ls you no 2>&1 1>&2|egrep \* >file
这句第一个2>&1把标准输出的管道复制给了2,所以1和2都走的标准输出,后面1>&2时由于他俩都是标准输出了,后面这个复制其实没有起作用,于是所有的标准输出都走了管道,并输出到了文件


2、(ls you no 2>&1) 1>&2|egrep \* >file
先说子shell中,1的标准输出复制给了2,所以子shell的输出全部都是标准输出,整体输出后,碰到1>&2,把标准错误的管道复制给了1,所以这个时候管道之前的所有输出都变成了标准错误,标准错误是不会进入管道的,所以直接作为错误打印到了屏幕,egrep的管道接收不到任何输入流

本文出自 “一路狂奔” 博客,请务必保留此出处http://zhongwen.blog.51cto.com/2645063/1586306

ls you no 2>&1 1>&2|egrep \* >file 和 (ls you no 2>&1) 1>&2|egrep \* >file 执行结果不一样