技巧 Linux I O重定向的一些小技巧

2022-08-24 11:48:09 字數 2341 閱讀 7122

首先說一下什麼是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>&- 關閉檔案識別符號3

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

命令j<>filename表示把檔案開啟,並指明檔案識別符號為j 

"&-"表示關閉檔案識別符號

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

n<&- 關閉輸入檔案識別符號n

0<&-或<&- 關閉標準輸入stdin

n>&- 關閉輸出檔案識別符號n

1>&-或》&-關閉標準輸出stdout

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

2.	:> filename 或者 > filename

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

參考資料

關於作者

linuxI O的一些理解

同步i o 阻塞i o 非同步i o 非阻塞 同步,非同步的概念本來是通訊領域的,很難解釋清楚,但我肯定他跟阻塞非阻塞完全沒有任何關係。在這裡的同步非同步,我個人的理解是函式呼叫的時候的同步非同步。其實同步方式很好理解,例如你呼叫乙個function,當這個function執行完後,這個方法實現的功...

android UI 的一些技巧

一 去掉edittext的背景顏色 android background null 二 listview 修改某行的值,因為一些功能邏輯,需要修改listview某行的值,那麼就可通過下面的方法,獲取到對應的listview的某行,然後修改。private void updateview int i...

MySQL的一些技巧

使用rand 獲取隨機結果 在order by語句中可按照如下的隨機順序檢索資料行 mysql select from tbl name order by rand order by rand 同 limit 的結合從一組列中選擇隨機樣本很有用 mysql select from table1,ta...