1. 程式人生 > >linux的標準輸入輸出

linux的標準輸入輸出

0: 代表標準的std_in 1: 代表標準的std_out
2: 代表標準的std_err

重定向:

2>file, 將標準錯誤輸出重定向到檔案中。
1>file, 將標準輸出重定向到檔案中。
2>&1, 將標準的錯誤輸出重定向到標準輸出, 錯誤輸出將會顯示在終端上,效果和不加是一樣的,因為預設的錯誤輸出就是終端。那如果我們想達到一個把錯誤輸出既顯示在終端上又把這個錯誤記錄到檔案中的目的,我們這樣寫: ls FILE_NOT_EXIST | tee file,行不行呢? 這樣寫是不行的,這樣只能是把標準輸出的內容寫到檔案和標準輸出中,而沒有把標準的錯誤輸出寫到檔案中去。要達到上面的目的只能這樣寫:

ls FILE_NOT_EXIST 2>&1 | tee file
也就是tee命令只能是從標準輸出中讀取內容,而不能從標準錯誤輸出中讀取內容,為此,我們只能是首先把標準錯誤的輸出重定向到標準輸出中,然後再用tee命令讀出,寫到標準輸出和檔案中去。

NOTE:
 要特別注意linux對管道,重定向處理的順序,shell是從命令列的後面向前處理,例如:
ls feffe 2>&1 >/dev/null

feffe是系統中不存在的一個檔案,我們現在要把ls的錯誤輸出放到/dev/null中去,那上面的寫法能不能達到我們的目的呢? 答案是不能,因為shell處理這種情況是從後向前處理命令列,首先會把系統的標準輸出的東西重定向到/dev/null,然後再把標準錯誤輸出重定向到標準輸出,因此,我們應該這樣寫:


ls feffe >/dev/null 2>&1