LINUX SHELL 中 2>&1 重定向的问题

转载http://blog.csdn.net/pastgift/article/details/6992092

#manbash里面有一段有关重定向的描述:

Notethattheorderofredirectionsissignificant.Forexample,the

command

ls>dirlist2>&1

directsbothstandardoutputandstandarderrortothefiledirlist,

whilethecommand

ls2>&1>dirlist

directsonlythestandardoutputtofiledirlist,becausethestandard

errorwasduplicatedasstandardoutputbeforethestandardoutputwas

redirectedtodirlist.

辗转各个社区,终于算是略微明白了一点。

上面第一条命令:#ls>dirlist2>&1

把标准输出(STDOUT,1)和标准错误(STDERR,2)都重定向到文件dirlist的过程如下:

0 命令执行前

(此时:STDOUT指向终端、STDERR也指向终端)

1 建立名为dirlist的空文件

2 执行>dirlist

(因为>默认为重定向STDOUT,即该步骤将STDOUT重定向为文件dirlist)

(此时:STDOUT指向文件dirlist、STDERR指向终端)

3 执行2>&1,简单的说,就是STDERR变得和STDOUT一样。换句话说,就是把STDERR重定向为“STDOUT所指向的东西”

(因为之前STDOUT已经指向了文件dirlist,所以执行到该步骤时,STDERR也重定向到了文件dirlist)

(此时:STDOUT指向文件dirlist、STDERR也指向文件dirlist)

4 执行ls,则由于执行ls所产生的标准输出和标准错误信息都被输出到了文件dirlist里面。

上面的第二条命令:#ls2>&1>dirlist

仅仅把标准输出重定向到了文件dirlist中(标准错误依然是终端)

我们依然一步一步走,看看为什么:

0 命令执行前

(此时:STDOUT指向终端、STDERR也指向终端)

1 建立名为dirlist的空文件

2 执行2>&1

(因为原来STDOUT和STDERR都指向终端,所以相当于,把STDERR从终端,重定向为终端……)

(此时:STDOUT指向终端、STDERR也依然指向终端)

3 执行>dirlist,把STDOUT重定向为文件dirlist

(此时:STDOUT指向文件dirlist、STDERR依然指向终端)

4 执行ls,那么,产生的STDOUT输出到了文件dirlist里面,而STDERR输出到了终端

另外,要将STDOUT和STDERR都输出到文件,也可以这么写:

#ls&>dirlist

这样还比较方便一点。

以下是相关讨论的地址:

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html#ss3.2

http://bbs.chinaunix.net/viewthread.php?tid=16361

http://www.linuxsir.com/bbs/showthread.php?threadid=38203

http://www.linuxsir.com/bbs/showthread.php?threadid=40501&highlight=%D6%D8%B6%A8%CF%F2

相关推荐