鸟哥的书中详细讲了>,>>,2>,2>>这些东西,但唯独没讲&这符号是什么意思,只留了两句话让我猜测2>&1是将stderr合并到stdout,以及&>是stderr与stdout合并输出的意思.
尽管如此,我还是不懂&本身是什麽意思.网上搜到的回答也都是讲整个命令是什么意思,换个写法估计他们也不知道是什么意思,例如
3>&1 创建一个新的FD3,保存当前stdout的文件描述符
3>&- 关闭之前创建的FD3
所以我的问题是:&本身是什么意思?
还有一个小问题,因为普通用户使用find命令会同时有stdout和stderr,若想将它们都写入一个文件,正常命令是这样的
find /etc -name .bashrc > list 2>&1
我想问为什么不能调下顺序,比如这样
find /etc -name .bashrc 2>&1 > list
因为我觉得它们意思都是一样的,但结果不同难道仅是因为格式要求?
这里的
&
没有固定的意思放在
>
后面的&
,表示重定向的目标不是一个文件
,而是一个文件描述符
,内置的文件描述符如下换言之
2>1
代表将stderr
重定向到当前路径下文件名为1
的regular file
中,而2>&1
代表将stderr
重定向到文件描述符
为1
的文件(即/dev/stdout
)中,这个文件就是stdout
在file system
中的映射而
&>file
是一种特殊的用法,也可以写成>&file
,二者的意思完全相同,都等价于此处
&>
或者>&
视作整体,分开没有单独的含义第二个问题:
这个是从左到右有顺序的
第一种
先将要输出到
stdout
的内容重定向到文件,此时文件list
就是这个程序的stdout
,再将stderr
重定向到stdout
,也就是文件list
第二种
先将要输出到
stderr
的内容重定向到stdout
,此时会产生一个stdout的拷贝
,作为程序的stderr
,而程序原本要输出到stdout
的内容,依然是对接在stdout原身
上的,因此第二步重定向stdout
,对stdout的拷贝
不产生任何影响引自 http://www.gnu.org/software/bash/manual/bashref.html#Redirections