1 跟 2 都是文件描述符,1 代表标准输出(STDOUT),2 代表标准错误输出(STDERR)。>&
的作用是把一个文件描述符指向到另一文件描述符。
例如,我有个程序:foo
。我希望把 foo 的所有输出存储到文件中,那么我可以这么做:
$ foo 1>&foo-out.log 2>&1
那么这里的意思就是,先把 1 (STDOUT)重定向到 foo-out.log
这个文件,然后把 2(STDERR)重定向到 1。这样,foo 的全部输出就都被我们存储到文件中去了。
另一种使用场景就是利用管道符(|
)传递所有的输出,因为 |
的作用是将前一个命令的 STDOUT 对接到下一个命令的 STDIN 上,所以,前一个命令的 STDERR 就无法通过 |
传递,为了解决这个问题,可以这样做:
$ foo 2>&1 | less