要搞清楚數據流重定向,須要先搞清楚什麼是數據流,而後如何重定向,這一切都須要從命令的執行過程提及。學習
如上圖所示爲命令的執行過程,能夠看到,在Linux中,數據流分三種:標準輸入(stdin)、標準輸出(stdout)和標準錯誤(stderr)。this
執行命令時,這個命令可能經過文件讀入數據,處理後再將數據輸出到屏幕,譬如:spa
cat /etc/crontab /etc/notexist
cat會由/etc/cronbtab和/etc/notexist讀入數據,而後將數據輸出到屏幕上,不過,由於不存在/etc/notexist這個文件,因此會顯示錯誤消息,這個消息也打印到屏幕上。code
所謂的數據流重定向,就是將命令執行後應該要出如今屏幕上的數據,傳輸到其餘地方,例如文件或者設備。而要把這些數據傳送到別的地方,則須要用到傳送命令。blog
咱們知道,要將默認輸入到屏幕上的數據流重定向,須要傳送命令,主要分爲三種:crontab
1. 標準輸入(stdin):代碼爲0,使用<或者<<ci
2. 標準輸出(stdout):代碼爲1,使用>或者>>get
3. 標準錯誤(stderr):代碼爲2,使用2>或者2>>input
總結來講,命令執行中重定向的方式以下:it
命令 |
> 1> >> 2> 2>> < |
設備或文件 |
其中>和1>是同樣的,由於標準輸出代碼是1,能夠省略。
例如,將ls –l 根目錄的數據重定向到~/rootfile:
ls -l / > ~/rootfile
整個重定向的過程以下:
(1)當文件(本例中的~/rootfile)不存在時,系統自動創建。
(2)若是文件存在,則先把文件的內容清空,而後寫入數據。
若是不想清空原來的數據,而是想在原來的基礎上累加,則須要使用>>,如:
ls -l / >> ~/rootfile
例如,咱們cat一個不存在的文件:
cat notexistfile 提示:cat: notexistfile: No such file or directory
若是咱們要把這個錯誤輸出,重定向,就能夠這樣:
cat notexistfile 2> errorfile
除了重定向的是標準錯誤外,它的重定向過程和>是同樣的,固然若是想累加,就用2>>。
組合一下就好了,如:
cat /etc/crontab /etc/notexist > rightfile 2> errorfile
特別的,若是要將數據輸入同一個文件,這個時候不能這麼寫:
cat /etc/crontab /etc/notexist > errorfile 2> errorfile
這條指令並不會提示錯誤,可是由於有兩條數據流同時寫入一個文件,會致使交叉寫入,形成數據錯亂,讓文件的信息不可讀,這個時候須要用到2>&1,表示將標準錯誤重定向到標準輸出中去:
cat /etc/crontab /etc/notexist > errorfile 2>&1
或者,使用更簡潔的符號&>,上面的語句等價於:
cat /etc/crontab /etc/notexist &> errorfile
這個時候就須要用到 /dev/null 這個文件了,它至關於一個黑洞或者說垃圾桶,當重定向到這個文件時,全部信息都會消失不見:
cat /etc/crontab /etc/notexist > /dev/null 2>&1
譬如,咱們使用cat命令在鍵盤上輸入數據,而後寫入一個文件:
cat > catfile this a file <== 輸完以後經過ctrl+d結束輸入
此時就有catfile產生,文件內容就是剛輸入的內容,若是想經過其餘文件來代替鍵盤輸入,則能夠:
cat > catfile2 < catfile
這就是<的用法,而<<的用法有點不同,它表示「結束的輸入字符」,例如咱們想用cat將輸入的消息輸出到catfile中,且當輸入EOF時,此次輸出結束:
cat > catfile <<EOF > this is a new input > EOF
當輸入EOF的時候就會自動結束輸入,而沒必要使用ctrl+d來結束,注意的是EOF沒有寫入文件。
1. 屏幕的輸出很重要,須要保存到文件中。
2. 後臺執行的程序,不但願它干擾屏幕正常的輸出結果。
3. 一些系統的例行性命令如crontab的執行結果,但願它能保存下來。
4. 一些執行命令,已經知道它可能的錯誤消息,想經過」2> /dev/null」直接丟掉。
5. 錯誤消息和正確消息須要分別輸出。
《鳥哥的Linux私房菜_基礎學習篇》(第二版)
(完)