2013-10-24 73 views
2

这两个bash命令的区别是什么: 1. printf“somthing wrong!%v”哎呀! > dumpz 2> 2. printf“somthing wrong!%v”哎呀! 2> & 1> dumpz 当我使用第一个脚本时,两个流都保存在文件(dumpz)中。 当我使用第二个脚本时,只有标准输出进入文件并且终端中显示标准错误。流重定向顺序和操作系统执行的细节

另一个问题是为什么在第一个脚本中,流的顺序是不正确的。我的意思是第一行文件包含标准错误,第二行包含标准输出。 我需要一些关于这个流的背景真正做了什么的帮助。我的意思是什么操作系统真正执行(指针,内存等)。

+2

对于[RTFM](http://en.wikipedia.org/wiki/Redirection_%28computing%29)来说并不是那么糟糕,至少*偶尔一次*。 – devnull

回答

0

订单在这些重定向中非常重要。

printf "somthing wrong!%v" Oops! > dumpz 2>&1 

将标准输出重定向到文件dumpz,然后重定向错误输出到标准输出的地方被重定向。

但是这个命令:

printf "somthing wrong!%v" Oops! 2>&1 > dumpz 

将第一stderr重定向到哪里标准输出被重定向(TTY或终端),然后重定向标准输出到dumpz文件。

+0

那么不正确的顺序是什么,当我使用第一个命令文件包含第一行stderr和第二行stdout。 – muradin

+0

不要问你的问题。你在说这个命令:'2>&1> dumpz'? – anubhava

+0

我在说printf“somthing wrong!%v”哎呀! > dumpz 2>&1 – muradin

2

的重定向功能的应用程序发生在您指定的顺序,所以在第一种情况下

printf "somthing wrong!%v" Oops! > dumpz 2>&1 

它首先重定向标准输出到文件,然后重定向错误输出到任何标准输出指向,这是文件。

在第二种情况下

printf "somthing wrong!%v" Oops! 2>&1 > dumpz 

它首先重定向标准错误输出到任何标准输出被引导至(当前终端)。然后它将stdout重定向到该文件。

+0

那么不正确的顺序是什么,当我使用第一个命令文件包含第一行stderr和第二行stdout。 – muradin

+0

[这里是](http://www.catonmat.net/blog/bash-one-liners-explained-part-three/)非常好的解释(与图片)在执行两个版本的过程中真正发生的事情例子。 –