1. 程式人生 > >Linux重定向及標準輸入、輸出、錯誤相關

Linux重定向及標準輸入、輸出、錯誤相關



通常情況,每個 Unix 程式在啟動時都會開啟三個流,一個用於輸入,一個用於輸出,一個用於列印診斷或錯誤訊息。它們分別被做:標準輸入,標準輸出,標準錯誤。

標準輸入是程式可以讀取其輸入的位置。預設情況下,程序從鍵盤讀取 stdin

標準輸出是程式寫入其輸出的位置。預設情況下,程序將 stdout 寫到終端螢幕上。

標準錯誤是程式寫入其錯誤訊息的位置。預設情況下,程序將 stderr 寫到終端螢幕上。

重定向:

資料流重導向(重定向)就是將某個指令(命令)執行後的執行返回值,一般這些返回值就是你執行完後出現在螢幕上那些結果資料。如果不想讓他預設流向螢幕,可以把這些結果資料傳輸到其他的地方,例如檔案或者裝置

(例如印表機,不過在Linux裡面一切都一切都是檔案,所以印表機這樣的裝置也是檔案)

>資料流重導向:輸出導向,會替換被導向的檔案內容.

>>資料流重導向:輸出導向,不會替換被導向的檔案內容,會累加資料.

檔案描述符:

POSIX 定義了STDIN_FILENOSTDOUT_FILENO STDERR_FILENO 來代替 012這三個符號常量的定義位於標頭檔案 unistd.h

標準輸入 (stdin) 檔案描述符為 0 ,使用 < << ;其實可以理解為這個箭頭指向哪裡資料就往哪裡跑.這裡是輸入(stdin).命令就通過

<來獲取資料.等於資料是從左邊往命令裡面流.

標準輸出 (stdout)檔案描述符為 1 ,使用 > >> ;輸出的時候不能用<或者<<,因為命令總是在前面.這裡命令要輸出資料.所以資料的來源是命令,資料就會隨著箭頭指向你給的方向.

標準錯誤輸出(stderr)檔案描述符為 2 ,使用 2> 2>>;

command >file 2>&1

首先command >file 2>file 的意思是將命令所產生的標準輸出資訊,和錯誤的輸出資訊送到file中;command>file 2>file

這樣的寫法,stdoutstderr都直接送到file, file會被開啟兩次,這樣stdoutstderr會互相覆蓋,這樣寫相當使用了兩個同時去搶佔file的管道.定向了2次。

那如果使用command >file 2>&1 這條命令就將stdout直接送向file,stderr 繼承了第一次重定向(FD1)到管道後,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdoutstderr的內容。

/dev/null

Linux下還有一個非凡的檔案/dev/null,它就像一個無底洞,所有重定向到它的資訊都會消失得無影無蹤。這一點非常有用,當我們不需要回顯程式的所有資訊時,就可以將輸出重定向到/dev/null

假如想要正常輸出和錯誤資訊都不顯示,則要把標準輸出和標準錯誤都重定向到/dev/null

>/dev/null表示將程式通過printf或者fprintf列印到handle1stdout檔案的資訊,送到/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