2014-02-16 103 views
1

當我執行此命令(其中fail.cpp是一個充滿編譯器錯誤的簡單程序)時,錯誤不會直接在屏幕上輸出,而是在fail.out文件中輸出:bash:混淆重定向輸出

g++ fail.cpp > fail.out 2>&1 

從我的bash的介紹性的認識,這是有道理的:>重定向程序輸出(stdout,又名1)fail.out,而2>&1 stderr重定向(又名2)爲標準輸出這個新的地方,這是文件。 (?)

但改變指令的順序,使事情發生不同:

g++ fail.cpp 2>&1 > fail.out 

現在,錯誤信息直接在屏幕上,並fail.out是一個空白文件。

這是爲什麼?這似乎與上面的想法相同:將此命令將產生的錯誤重定向到標準輸出(2>&1),並將其重定向到fail.out文件。這是我缺少的操作順序嗎?

+0

[重定向](http://en.wikipedia.org/wiki/Redirection_%28computing%29) – devnull

+0

在[bash手冊](http://www.gnu.org/software/)中的一個很好的解釋bash的/手動/ html_node/Redirections.html)。 –

回答

7

2>&1表示「將stderr重定向到stdout當前連接的位置」,並且按照從左到右的順序處理重定向。所以第一個是:

  1. 將stdout重定向到fail.out文件。
  2. stderr重定向到stdout的當前連接,即fail.out文件

第二個作用:

  1. stderr重定向到stdout的當前連接,即所述終端。
  2. 將stdout重定向到fail.out文件。
+0

所以,可以肯定的是'''和'>&1'意思相同嗎? – nicole

+0

編號''文件名'意味着重定向到'文件名'。 '>&1'表示重定向到當前連接了'stdout'的地方。 – Barmar

+0

啊。也許我應該問,「does'>'和'&1>'是否相同?? – nicole