LINUX下C語言重定向

參考C primer plus 第五版 P195spa

Linux環境中支持輸入輸出重定向,用符號<和>來表示。
0、1和2分別表示標準輸入、標準輸出和標準錯誤信息輸出,能夠用來指定須要重定向的標準輸入或輸出,好比 2>lee.dat 表示將錯誤信息輸出到文件lee.dat中。
同時,還能夠在這三個標準輸入輸出之間實現重定向,好比將錯誤信息重定向到標準輸出,能夠用 2>&1來實現。
Linux下還有一個特殊的文件/dev/null,它就像一個無底洞,全部重定向到它的信息都會消失得無影無蹤。這一點很是有用,當咱們不須要回顯程序的全部信息時,就能夠將輸出重定向到/dev/null。
若是想要正常輸出和錯誤信息都不顯示,則要把標準輸出和標準錯誤都重定向到/dev/null, 例如:
# ls 1>/dev/null 2>/dev/null
還有一種作法是將錯誤重定向到標準輸出,而後再重定向到 /dev/null,例如:
# ls >/dev/null 2>&1
注意:此處的順序不能更改,不然達不到想要的效果,此時先將標準輸出重定向到 /dev/null,而後將標準錯誤重定向到標準輸出,因爲標準輸出已經重定向到了/dev/null,所以標準錯誤也會重定向到/dev/null。
1. 標準輸入的控制
語法:命令< 文件將文件作爲命令的輸入。
例如:
mail -s "mail lee」 lee@lee.com < lee1 將文件lee1 當作信件的內容,主題名稱爲mail lee,送給收信人。
2. 標準輸出的控制
語法:命令> 文件
將命令的執行結果送至指定的文件中。
例如:
ls -l > lee.dat 將執行"ls -l"命令的結果寫入文件 lee.dat 中。
語法:命令>! 文件
將命令的執行結果送至指定的文件中,若文件已經存在,則覆蓋。
例如:
ls -lg >! lee.dat 將執行"ls -lg"命令的結果覆蓋寫入文件 lee.dat 中。
語法:命令>& 文件
將命令執行時屏幕上所產生的任何信息寫入指定的文件中。
例如:
cc lee.c >& lee.dat 將編譯 lee.c 文件時所產生的任何信息寫入文件 lee.dat 中。調試

語法:命令>> 文件
將命令執行的結果附加到指定的文件中。
例如:
ls -lag >> lee.dat 將執行 "ls -lag" 命令的結果附加到文件 lee.dat 中。get

語法:命令>>& 文件
將命令執行時屏幕上所產生的任何信息附加到指定的文件中。
例如:
cc lee.c >& lee.dat 將編譯 lee.c 文件時屏幕所產生的任何信息附加到文件 lee.dat 中。編譯

在字符終端環境中,標準輸入/標準輸出的概念很好理解。輸入即指對一個應用程序或命令的輸入,不管是從鍵盤輸入仍是從別的文件輸入;輸出即指應用程序或命令產生的一些信息;與 Windows 系統下不一樣的是,Linux 系統下還有一個標準錯誤輸出的概念,這個概念主要是爲程序調試和系統維護目的而設置的,錯誤輸出於標準輸出分開可讓一些高級的錯誤信息不干擾正常的輸出信息,從而方便通常用戶的使用。
在 Linux 系統中:標準輸入(stdin)默認爲鍵盤輸入;標準輸出(stdout)默認爲屏幕輸出;標準錯誤輸出(stderr)默認也是輸出到屏幕(上面的 std 表示 standard)。在 BASH 中使用這些概念時通常將標準輸出表示爲 1,將標準錯誤輸出表示爲 2。下面咱們舉例來講明如何使用他們,特別是標準輸出和標準錯誤輸出。
輸入、輸出及標準錯誤輸出主要用於 I/O 的重定向,就是說須要改變他們的默認設置。先看這個例子:
$ ls > lee.dat
$ ls -l >> lee.dat
上面這兩個命令分別將 ls 命令的結果輸出重定向到 lee.dat 文件中和追加到 lee.dat 文件中,而不是輸出到屏幕上。">"就是輸出(標準輸出和標準錯誤輸出)重定向的表明符號,連續兩個 ">" 符號,即 ">>" 則表示不清除原來的而追加輸出。下面再來看一個稍微複雜的例子:
$ find /home -name lee* 2> err_lee
這個命令在 ">" 符號以前多了一個 "2","2>" 表示將標準錯誤輸出重定向。因爲 /home 目錄下有些目錄因爲權限限制不能訪問,所以會產生一些標準錯誤輸出被存放在 err_result 文件中。你們能夠設想一下 find /home -name lee* 2>>err_result 命令會產生什麼結果?
若是直接執行 find /home -name lee* > all_lee ,其結果是隻有標準輸出被存入 all_lee 文件中,要想讓標準錯誤輸出和標準輸入同樣都被存入到文件中,那該怎麼辦呢?看下面這個例子:
$ find /home -name lee* > all_lee 2>& 1
上面這個例子中將首先將標準錯誤輸出也重定向到標準輸出中,再將標準輸出重定向到 all_lee 這個文件中。這樣咱們就能夠將全部的輸出都存儲到文件中了。爲實現上述功能,還有一種簡便的寫法以下:
$ find /home -name lee* >& all_lee
若是那些出錯信息並不重要,下面這個命令可讓你避開衆多無用出錯信息的干擾:
$ find /home -name lee* 2> /dev/null
同窗們回去後還能夠再試驗一下以下幾種重定向方式,看看會出什麼結果,爲何?
$ find /home -name lee* > all_lee 1>& 2
$ find /home -name lee* 2> all_lee 1>& 2
$ find /home -name lee* 2>& 1 > all_lee
外一個很是有用的重定向操做符是 "-",請看下面這個例子:
$ (cd /source/lee && tar cf - . ) | (cd /dest/lee && tar xvfp -)
該命令表示把 /source/lee 目錄下的全部文件經過壓縮和解壓,快速的所有移動到 /dest/lee 目錄下去,這個命令在 /source/lee 和 /dest/lee 不處在同一個文件系統下時將顯示出特別的優點。
下面還幾種不常見的用法:
n<&- 表示將 n 號輸入關閉
<&- 表示關閉標準輸入(鍵盤)
n>&- 表示將 n 號輸出關閉
>&- 表示將標準輸出關閉
再給你們一個頗有用的命令:
grep lee `find . 2>/dev/null|grep sh$`
看不明白的及時call me。終端

相關文章
相關標籤/搜索