Linux重定向及標準輸入、輸出、錯誤相關
通常情況,每個 Unix 程式在啟動時都會開啟三個流,一個用於輸入,一個用於輸出,一個用於列印診斷或錯誤訊息。它們分別被做:標準輸入,標準輸出,標準錯誤。
標準輸入是程式可以讀取其輸入的位置。預設情況下,程序從鍵盤讀取 stdin 。
標準輸出是程式寫入其輸出的位置。預設情況下,程序將 stdout 寫到終端螢幕上。
標準錯誤是程式寫入其錯誤訊息的位置。預設情況下,程序將 stderr 寫到終端螢幕上。
重定向:
資料流重導向(重定向)就是將某個指令(命令)執行後的執行返回值,一般這些返回值就是你執行完後出現在螢幕上那些結果資料。如果不想讓他預設流向螢幕,可以把這些結果資料傳輸到其他的地方,例如檔案或者裝置
>資料流重導向:輸出導向,會替換被導向的檔案內容.
>>資料流重導向:輸出導向,不會替換被導向的檔案內容,會累加資料.
檔案描述符:
POSIX 定義了STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 來代替 0、1、2。這三個符號常量的定義位於標頭檔案 unistd.h。
標準輸入 (stdin)
:檔案描述符為 0
,使用 <
或 <<
;其實可以理解為這個箭頭指向哪裡資料就往哪裡跑.這裡是輸入(stdin).命令就通過
標準輸出 (stdout):檔案描述符為 1 ,使用 > 或 >> ;輸出的時候不能用<或者<<,因為命令總是在前面.這裡命令要輸出資料.所以資料的來源是命令,資料就會隨著箭頭指向你給的方向.
標準錯誤輸出(stderr):檔案描述符為 2 ,使用 2> 或 2>>;
command >file 2>&1
首先command >file 2>file
的意思是將命令所產生的標準輸出資訊,和錯誤的輸出資訊送到file中;command>file
2>file
那如果使用command >file 2>&1 這條命令就將stdout直接送向file,stderr 繼承了第一次重定向(FD1)到管道後,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容。
/dev/null
Linux下還有一個非凡的檔案/dev/null,它就像一個無底洞,所有重定向到它的資訊都會消失得無影無蹤。這一點非常有用,當我們不需要回顯程式的所有資訊時,就可以將輸出重定向到/dev/null。
假如想要正常輸出和錯誤資訊都不顯示,則要把標準輸出和標準錯誤都重定向到/dev/null
>/dev/null表示將程式通過printf或者fprintf列印到handle為1的stdout檔案的資訊,送到/dev/null空洞檔案。
例項:
crontab 排程,顯示標準和出錯資訊到一個輸出檔案。
[[email protected] sdk-dataproc]$ crontab -l
0 6 * * * sh /home/hadoop/sdk-dataproc/sdk-ctl.sh >>/home/hadoop/sdk-dataproc/corn-err.txt 2>&1