網站首頁 語言 會計 網際網路計算機 醫學 學歷 職場 文藝體育 範文
當前位置:學識谷 > IT認證 > Linux認證

關於linux bash的重定向

欄目: Linux認證 / 釋出於: / 人氣:4.52K

所謂I/O重定向簡單來說就是一個過程,這個過程捕捉一個檔案,或者命令,程式,指令碼,甚至指令碼中的程式碼塊(code block)的輸出,然後把捕捉到的輸出,作為輸入傳送給另外一個檔案,命令,程式,或者指令碼。

關於linux bash的重定向

如果談到I/O重定向,就涉及到檔案識別符號(File Descriptor)的概念, 在Linux系統中,系統為每一個開啟的檔案指定一個檔案識別符號以便系統對檔案進行跟蹤,這裡有些和C語言程式設計裡的檔案控制代碼相似,檔案識別符號是一個數字,不同數字代表不同的含義,預設情況下,系統佔用了3個,分別是0標準輸入(stdin),1標準輸出(stdout), 2標準錯誤(stderr), 另外3-9是保留的識別符號,可以把這些識別符號指定成標準輸入,輸出或者錯誤作為臨時連線。通常這樣可以解決很多複雜的重定向請求。

標準輸入通常指鍵盤的.輸入

標準輸出通常指顯示器的輸出

標準錯誤通常也是定向到顯示器

請看以下例子,來描述一下他們的關係

#ls /dev

這個命令列出/dev目錄下的所有檔案,在螢幕上輸出結果。

這裡 /dev 就是作為命令ls的標準輸入(從鍵盤輸入),而列印在螢幕的結果就是標準輸出(/dev目錄中的內容)

還是回到標題,重定向就是把標準的輸入或者輸出更改成其他的方式,請參看如下例子

或者等同於

#ls /dev 1>filename #注意:"1"和">"中間沒有空格

以上命令會把命令的標準輸出重新定向到一個檔案filename,而不是顯示到螢幕上,如果不指明檔案識別符號,系統預設的就是1, 因此1可以省略

如果把上面例子重的">"改成">>"則表示把輸出追加到filename檔案的末尾,如果檔案不存在則建立它。如下

#ls /dev >>filename

也可以把標準錯誤重新定向到檔案

#ls -qw /dev 2>filename

顯然 -qw是一個錯誤引數,通常會在顯示器上報告一個錯誤資訊,但由於把2標準錯誤(stderr)重新定向到了檔案filename,因此顯示器沒有錯誤資訊,而資訊寫到了檔案裡面

以下命令是把標準輸出和錯誤都定向到檔案

#ls /dev &>filename

"&"在這裡代表標準輸出和標準錯誤,這裡無論是正常輸出還是錯誤資訊都寫到filename中了。

重新定義標準輸入,輸出,和錯誤的檔案識別符號

重新定義檔案識別符號可以用i>&j命令,表示把檔案識別符號i重新定向到j,你可以把"&"理解為"取地址"

請看以下例子

#exec 5>&1

表示把檔案識別符號5定向到標準輸出,這個命令通常用來臨時儲存標準輸入。

同樣標準輸入也是可以重新定向的,請參考下面例子

# grep search-word

一般來說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<&- 關閉輸入檔案識別符號n 0<&-或<&- 關閉標準輸入stdin n>&- 關閉輸出檔案識別符號n 1>&-或>&-關閉標準輸出stdout

另外還有一些其他命令,如下參考

2. :> filename 或者 > filename

表示把檔案filename設定成空,也就是清空檔案內容,如果檔案不存在,則建立一個空檔案,(等同於touch命令) :表示一個空輸出,兩個命令的唯一區別就是>filename不是在所有shell都可以正常工作的。