2013-06-26 16 views
1

這些是什麼命令之間的差異:不同的輸入/輸出重定向樣式有什麼區別?

  1. command 2>&1 > log
  2. command > log 2>&1
  3. command >& log
  4. command > log 1>&2

首先一個輸出錯誤到控制檯,並且在輸出到日誌。爲什麼不都不去日誌?

第二個不產生任何輸出,輸出和錯誤都在日誌中。 2>&1到底有什麼不同?

第三個和以前一樣。什麼是快捷方式?

第四個把所有東西都放在控制檯上,而沒有任何東西放在日誌中?

示例命令:ls -ld /tmp /xxx

+0

恕我直言的情況#2和#4是相同的,不是嗎? – TrueY

+0

@TrueY編號#2讓2指向1,#4讓1指向2. – glglgl

+0

@glglgl:修改完Q後:) – TrueY

回答

4

這些在twoarticles很好說明。實質上,您必須從左至右讀取重定向,作爲輸出目標的副本。所以

command 2>&1 > log 
  1. 設置FD 2(標準誤差)的目標到FD 1(標準輸出),這通常是終端的目標。
  2. 將FD 1的目標設置爲文件log

這些不是傳遞性的,所以標準錯誤真的指向終端,當命令運行時。


command > log 2>&1 
  1. 設置FD 1的目標向文件log
  2. 將FD 2(標準錯誤)的目標設置爲FD 1(標準輸出)的目標,該目標現在是文件log

這意味着標準輸出和標準錯誤都記錄到同一個文件。


command >& log 

重定向兩個標準誤差和標準輸出到文件log。這是前一個命令的Bash語法糖。


command > log 1>&2 
  1. 設置FD 1的目標向文件log
  2. 將FD 1的目標設置爲通常爲終端的FD 2(標準錯誤)的目標。這覆蓋了以前的重定向。
2

重定向順序是很重要的:

  1. command 2>&1 > log重定向到stderrstdout然後stdout日誌文件。所以結果是stderr轉到屏幕(如果沒有在更高級別上重定向)並且stdout轉到文件。
  2. command > log 2>&1stdout重定向到文件,而stderr重定向到文件句柄1這是文件。
  3. command >&log是上一個案例的快捷方式,即它將stderrstdout重定向到該文件。
  4. 此它相同的大小寫#2
  5. command > log 1>&2重定向stderr(文件句柄1)到一個文件,然後將其重定向到stderr。因此stdout將會轉到stderr。但是會出現一個零字節長的文件log。這可以寫成command >log >&2