在 Segmentfault 中看到一个同样的问题,作为笔记记录下来

0x1 &含义

重定向> filename 2&>1表示将前面的正确/错误输入都传给后面的 filename, 但是&这个概念就不是很清楚

xelz 而 2>&1 代表将 stderr 重定向到文件描述符为 1 的文件(即/dev/stdout)

所以&就是为了标志 1 不是一个文件名而是一个文件描述符

0x2 特殊用法: &> filename

整体使用 &> === >& 等价于> filename 2&>1

0x3 调用顺序

正 find / -name 'desktop' > tmpfile 2>&1

文件内容:stdout+stderr 先将 stdout 输出到 file,此时的 file 就是该 shell 的 stdout,之后再将 stderr(2)重定向到 stdout(1)

误 find / -name 'desktop' 2>&1 > tmpfile2

文件内容:stdout 先将要输出到 stderr 的内容重定向到 stdout,此时会产生一个stdout的拷贝,作为程序的 stderr,而程序原本要输出到stdout的内容,依然是对接在 stdout 原身上的,因此第二步重定向stdout,对 stdout 的拷贝不产生任何影响

Reference

https://segmentfault.com/q/1010000002454596