一、什麼是資料流重新導向在說資料流重新導向之前,先來說說資料流的概念吧。資料流分為三種:標準輸入(stdin),標準輸出(stdout)和標準錯誤輸出(stderr)。簡單來說,標準輸出指的是命令執行所回傳的正確資訊,而標準錯誤輸出指的是命令執行失敗後,所回傳的錯誤資訊。這些資訊預設是列印在螢幕上的。那麼什麼時資料流重新導向呢?從字面上理解就是改變資料流的流向,使之流向指定的檔案或裝置。例如,把執行命令所回傳的正確資訊(標準輸出資訊)流向一個檔案,而將所回傳的錯誤資訊(標準錯誤輸出)流向別一個檔案,並把這兩個檔案的資訊儲存下來,而在螢幕上不出現任何該命令執行所回傳的資訊。二、資料流重新導向的實現1、資料流重寫向的分類在Linux中利用shell實現資料流重新導向是非常簡單的,下面來介紹3種資料流的重新導向。1)標準輸入(stdin):代碼為0,使用<或者<<2)標準輸出(stdout):代碼為1,使用>或者>>3)標準錯誤輸出(stderr):代碼為2,使用2>或者2>>看到這裡,你可能還是很疑惑,那個代碼有什麼作用,<和<<有什麼不同,>和>>又有什麼不同?2、代碼的作用那個代碼是為了區分命令中所使用的不同的資料流而設定的,例如,0代碼的就是標準輸入。注意在預設情況下,>和>>分別表示1>和1>>,而<和<<分別表示0<和0<<。3、標準輸出資料流重新導向詳解在說輸入之前,我先跟大家說說輸出吧,一般使用例子都能讓人更容易明白一樣東西是怎麼樣使用的。所以請看下面的例子,在目前的目錄下,已存在一個名為StreamTest.txt的文本件,我使用cat命令來進行測試,我們知道,cat命令會把文字檔中的內容輸出到螢幕上來。請看下面的例子:我們可以看到直接使用cat命令,StreamTest.txt檔案的內容直接列印在螢幕上。而第二條語句cat StreamTest.txt > outfile1使用了資料流重新導向,那麼這條語句是什麼意思呢?它的意思就是把由cat命令所產生的直接輸出到螢幕上的資訊輸出到檔案outfile1中,並儲存。而且你可以看到,原本應在螢幕上輸出的資訊並沒有輸出到螢幕上,因為它輸出到了檔案outfile1中。這樣你就應該能理解為什麼叫資料流重新導向了吧。值得注意的是,如果outfile1檔案不存在於目前的目錄下,系統則會自動建立這個檔案;如果這個檔案已經存在於目前的目錄下,那麼系統就會先把這個檔案中的內容清空,然後再將資料寫入到該檔案,也就是說若以>輸出到一個已存在的檔案,則這個檔案的內容將會被覆蓋。那有沒有什麼方法能不讓檔案內容被覆蓋呢?當然就,那就是>>,這也就是>與>>的區別。其用法與>大同小異,如:同樣的,使用這個命令,如果outfile2不存在於目前的目錄中,則系統會自動建立這個檔案,而如果這個檔案已經存在於當前目標下,則會把資料追加到該檔案的末尾。所以在圖中看到了兩份重複的內容。註:因為在預設情況下,>和>>分別表示1>和1>>,所以在命令中沒有用到1>和1>>,因為它們是等價的。4、標準錯誤輸出資料流重新導向詳解標準錯誤輸出的使用和標準輸出的使用大同小異,在這裡不再贅述,其使用如下:由於當前目標下不存在檔案TestStream.txt,所以直接使用cat,則會在螢幕上輸出錯誤提示,當然我們也可以用資料流重新導向2>來把它輸出到檔案errfile中,而不是輸出到螢幕上。因為>預設是代碼1,所以這裡需要寫成2>,系統才知道這個是標準錯誤輸入重新導向,那現在你應該更深刻地理解到代碼的作用了吧。而2>>也是追加的作用。通過上面的例子可以看到,我們可以利用資料流重新導向把錯誤資訊和正確資訊分開。5、標準輸入資料流重寫向詳解詳解在標準輸入中,<代表將原來需要由鍵盤輸入的資料改由檔案內容來替代,<<則代表結束輸入。例如:利用cat來建立一個簡單的檔案catfile1,如所示:如果目前的目錄下不存在catfile1,則系統自動建立這個檔案,並由鍵盤向這個檔案寫入內容;若檔案已存在,則用輸入的內容覆蓋該檔案中的內容。而標準輸入重新導向可以用檔案的內容來替代鍵盤輸入,其操作如所示:可以看到,它把catfile1的內容輸入到catfile2中,代替先前的鍵盤輸入。值得注意的是,在標準輸入重新導向中<<並不表示追加,而是表示結束輸入的意思,即作為一個結束符。請看如下的例子:之前的例子,都是使用ctrl+D來結束的,而這個例子,當你輸入“eof”時,自動結束了,當然這個結束符,你可以自己定義。這對寫程式是有一定的好處的。三、把正確資訊與錯誤資訊寫入同一個檔案中的方法上面的例子,都是把正確和錯誤的資訊分別儲存在不同的檔案上的,那有沒有辦法把正確和錯誤的資訊都儲存在同一個檔案中呢?當然有!請看下面的例子:注意:上面第三行的命令是錯誤的,雖然它看看起來非常直觀。它的錯誤並不是因為文法之類的錯誤,也不是因為它不能執行,而是因為,有兩條資料流同時寫入一個檔案,又沒有特殊的文法,此時會導致兩條資料流交叉地寫入檔案,造成次序的錯亂,而不是螢幕上原來輸出的排序,使檔案的資訊不可讀。四、屏蔽所有資訊的方法如果我有一定的目的,想把所有的錯誤資訊或正確資訊都屏蔽掉,可以怎麼辦呢?這時可以利用資料流重新導向,使它流向一個裝置——/dev/null,它就像一個黑洞一樣,可以吃掉任何導向這個裝置的資訊。請看下面的例子:無論是正確的資訊還是錯誤的資訊,它都能吃掉。五、何時使用資料流重新導向既然我們知道了資料流的重新導向,那麼什麼時候要使用資料流重新導向呢?資料流重新導向一般應用於:1、螢幕輸出的資訊很重要,而且我們需要將它儲存下來;2、後台執行中的程式,不希望它幹擾螢幕正常的輸出結果;3、一些系統的例行命令的執行結果,希望它能夠儲存下來;4、一些執行命令的可能已知出錯資訊時,想以“2>/dev/null”將它屏蔽掉;5、錯誤資訊和正確資訊需要分別輸出;