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