1. 程式人生 > >Shell中的>/dev/null 2>&1 與 2>&1 >/dev/null 與&>/dev/null 的區別

Shell中的>/dev/null 2>&1 與 2>&1 >/dev/null 與&>/dev/null 的區別

預設情況下,總是有三個檔案處於開啟狀態,標準輸入(鍵盤輸入)、標準輸出(輸出到螢幕)、標準錯誤(也是輸出到螢幕),它們分別對應的檔案描述符是0,1,2 。那麼我們來看看下面的幾種重定向方法的區別:

>/dev/null 2>&1 

//  實際上,應該等同於這樣: 1>/dev/null 2>/dev/null ,預設情況下就是1,標準輸出,所以一般都省略。 而&符號,後面接的是必須的檔案描述符。不能寫成2>1,這樣就成了標準錯誤重定向到檔名為1的檔案中了,而不是重定向標準錯誤到標準輸出中。所以這裡就是:標準輸出重定向到了/dev/null,而標準錯誤又重定向到了標準輸出,所以就成了標準輸出和標準錯誤都重定向到了/dev/null

2>&1 >/dev/null 

// 咋一看,這個跟上面那個有啥區別呢,不也是標準錯誤重定向到標準輸出,而標準輸出重定向到/dev/null麼? 最後不應該都重定向/dev/null麼? 我是這麼理解的!一條指令同一時刻要麼產生標準錯誤,要麼產生標準輸出。 當產出標準錯誤的時候,因這個標準錯誤重定向到了標準輸出,而標準輸出是輸出到螢幕。這個時候標準輸出還沒有被重定向到/dev/null,於是在螢幕上列印了。當產生標準輸出時,那麼它就不是標準錯誤,2>&1無效,於是標準輸出重定向dev/null,不列印到螢幕。所以最終結果將是:標準錯誤列印到螢幕,而標準輸出不列印到螢幕。

-------------

2016-01-22 更新

突然看到N年前的部落格, 才發現錯誤百出.更新下, 以免誤人, 事實上, 命令列的重定向什麼的, 是在執行命令之前就準備好了的. 解釋順序從左至右依次進行, 2&>1 ,而1是螢幕, 所以標準錯誤重定向到螢幕, 再而 1>/dev/null , 即標準輸出重定向到 /dev/null, 上述2>&1 >/dev/null  並不是什麼同一時刻要麼產生標準輸出要麼產生標準錯誤. 而是兩個不同的東西.

以以下變數的方式做個解釋,就很明顯了,這兩種方式是不同的,前者就像:

a=1

b=a

而後者就像:

b=a

a=1

&>/dev/null

// 這個就是,不管你是啥玩意兒檔案描述符,通通重定向到/dev/null