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 &- 關閉文件標識符3 現在cat filename文件的結果就成了1234.6789 命令jfilename表示把文件打開,並指明文件標識符為j "&-"表示關閉文件標識符 有關關閉文件標識符的操作請參考下面 n&-關閉標准輸出stdout 另外還有一些其他命令,如下參考 2.:> filename 或者 > filename 表示把文件filename設置成空,也就是清空文件內容,如果文件不存在,則創建一個空文件,(等同於toUCh命令) :表示一個空輸出,兩個命令的唯一區別就是>filename不是在所有shell都可以正常工作的。