Linux I/O 重新導向的一些小技巧

來源:互聯網
上載者:User
層級: 初級

樊奇 (fanqi@cn.ibm.com)
Xseries eServer 工程師, IBM TSS China Beijing

Linux I/O 重新導向雖然很簡單,但在指令碼編寫、系統管理時卻要常常打交道,搞清其中提示非常有用。

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

如果談到 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>&- 關閉檔案標識符

現在 cat filename 檔案的結果就成了 1234.6789

命令 j<>filename 表示把檔案開啟,並指明檔案標識符為 j
"&-" 表示關閉檔案標識符

有關關閉檔案標識符的操作請參考下面

n<&- 關閉輸入檔案標識符 n 
0<&-或<&- 關閉標準輸入 stdin
n>&- 關閉輸出檔案標識符 n
1>&-或>&-關閉標準輸出 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

全文出自 : IBM developerWorks 中國網站

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.