http://www.ibm.com/developerworks/cn/linux/l-iotips/
首先說一下什麼是I/O重新導向,所謂I/O重新導向簡單來說就是一個過程,這個過程捕捉一個檔案,或者命令,程式,指令碼,甚至指令碼中的代碼塊(code block)的輸出,然後把捕捉到的輸出,作為輸入發送給另外一個檔案,命令,程式,或者指令碼。
如果談到I/O重新導向,就涉及到檔案標識符(File Descriptor)的概念, 在Linux系統中,系統為每一個開啟的檔案指定一個檔案標識符以便系統對檔案進行跟蹤,這裡有些和C語言編程裡的檔案控制代碼相似,檔案標識符是一個數字,不同數字代表不同的含義,預設情況下,系統佔用了3個,分別是0標準輸入(stdin),1標準輸出(stdout), 2標準錯誤(stderr), 另外3-9是保留的標識符,可以把這些標識符指定成標準輸入,輸出或者錯誤作為臨時串連。通常這樣可以解決很多複雜的重新導向請求。
標準輸入通常指鍵盤的輸入
標準輸出通常指顯示器的輸出
標準錯誤通常也是定向到顯示器
請看以下例子,來描述一下他們的關係
這個命令列出/dev目錄下的所有檔案,在螢幕上輸出結果。
這裡 /dev 就是作為命令ls的標準輸入(從鍵盤輸入),而列印在螢幕的結果就是標準輸出(/dev目錄中的內容)
還是回到標題,重新導向就是把標準的輸入或者輸出更改成其他的方式,請參看如下例子
或者等同於
#ls /dev 1>filename #注意:"1"和">"中間沒有空格 |
以上命令會把命令的標準輸出重新定向到一個檔案filename,而不是顯示到螢幕上,如果不指明檔案標識符,系統預設的就是1, 因此1可以省略
如果把上面例子重的">"改成">>"則表示把輸出追加到filename檔案的末尾,如果檔案不存在則建立它。如下
也可以把標準錯誤重新定向到檔案
顯然 -qw是一個錯誤參數,通常會在顯示器上報告一個錯誤資訊,但由於把2標準錯誤(stderr)重新定向到了檔案filename,因此顯示器沒有錯誤資訊,而資訊寫到了檔案裡面
以下命令是把標準輸出和錯誤都定向到檔案
"&"在這裡代表標準輸出和標準錯誤,這裡無論是正常輸出還是錯誤資訊都寫到filename中了。
重新定義標準輸入,輸出,和錯誤的檔案標識符
重新定義檔案標識符可以用i>&j命令,表示把檔案標識符i重新定向到j,你可以把"&"理解為"取地址"
請看以下例子
表示把檔案標識符5定向到標準輸出,這個命令通常用來臨時儲存標準輸入。
同樣標準輸入也是可以重新定向的,請參考下面例子
# grep search-word <filename或者grep search-word 0<filename |
一般來說grep命令在給定檔案中搜尋字串,以上命令把檔案filename作為grep命令的標準輸入,而不是從鍵盤輸入。
前面曾經提到,系統為每一個開啟的檔案指定一個檔案標識符以便系統對檔案進行跟蹤,那麼預設的檔案標識符是什麼呢?答案是0,也就是標準輸入,或者可以說從鍵盤輸入。當然這個檔案標識符也可以自己指定,請參考下面例子
#echo 123456789 >filename 把字串寫到檔案filename中#exec 3<>filename 把檔案filename開啟,並指定檔案標識符為3#read -n 4 <&3 從檔案中讀4個字元,控制代碼已經指到第四個字元末尾#echo -n . >&3 在第5個字元處寫一個點,覆蓋第5個字元,-n表示不換行#exec 3>&- 關閉檔案標識符3 |
現在cat filename檔案的結果就成了1234.6789
命令j<>filename表示把檔案開啟,並指明檔案標識符為j
"&-"表示關閉檔案標識符
有關關閉檔案標識符的操作請參考下面
n<&- 關閉輸入檔案標識符n0<&-或<&- 關閉標準輸入stdinn>&- 關閉輸出檔案標識符n1>&-或>&-關閉標準輸出stdout |
另外還有一些其他命令,如下參考
2.:> filename 或者 > filename |
表示把檔案filename設定成空,也就是清空檔案內容,如果檔案不存在,則建立一個空檔案,(等同於touch命令) :表示一個空輸出,兩個命令的唯一區別就是>filename不是在所有shell都可以正常工作的。
參考資料
- Jeffrey Friedl, Mastering Regular Expressions, O'Reilly
- Mendel Cooper, Advanced Bash-Scripting Guide
- Michael Jang, Mastering Redhat 9
關於作者
樊奇,IBM TSS China Beijing ,Xseries eServer 工程師,對Linux 很有興趣。通過 fanqi@cn.ibm.com可以和聯絡。電話:010 84981188-6856