日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 3416 0

http://www.ibm.com/developerworks/cn/linux/l-iotips/

首先說(shuō)一下什么是I/O重定向,所謂I/O重定向簡(jiǎn)單來(lái)說(shuō)就是一個(gè)過(guò)程,這個(gè)過(guò)程捕捉一個(gè)文件,或者命令,程序,腳本,甚至腳本中的代碼塊(code block)的輸出,然后把捕捉到的輸出,作為輸入發(fā)送給另外一個(gè)文件,命令,程序,或者腳本。

如果談到I/O重定向,就涉及到文件標(biāo)識(shí)符(File Descriptor)的概念, 在Linux系統(tǒng)中,系統(tǒng)為每一個(gè)打開(kāi)的文件指定一個(gè)文件標(biāo)識(shí)符以便系統(tǒng)對(duì)文件進(jìn)行跟蹤,這里有些和C語(yǔ)言編程里的文件句柄相似,文件標(biāo)識(shí)符是一個(gè)數(shù)字,不同數(shù)字代表不同的含義,默認(rèn)情況下,系統(tǒng)占用了3個(gè),分別是0標(biāo)準(zhǔn)輸入(stdin),1標(biāo)準(zhǔn)輸出(stdout), 2標(biāo)準(zhǔn)錯(cuò)誤(stderr), 另外3-9是保留的標(biāo)識(shí)符,可以把這些標(biāo)識(shí)符指定成標(biāo)準(zhǔn)輸入,輸出或者錯(cuò)誤作為臨時(shí)連接。通常這樣可以解決很多復(fù)雜的重定向請(qǐng)求。

標(biāo)準(zhǔn)輸入通常指鍵盤(pán)的輸入?
標(biāo)準(zhǔn)輸出通常指顯示器的輸出?
標(biāo)準(zhǔn)錯(cuò)誤通常也是定向到顯示器

請(qǐng)看以下例子,來(lái)描述一下他們的關(guān)系

            #ls /dev


          

?

這個(gè)命令列出/dev目錄下的所有文件,在屏幕上輸出結(jié)果。

這里 /dev 就是作為命令ls的標(biāo)準(zhǔn)輸入(從鍵盤(pán)輸入),而打印在屏幕的結(jié)果就是標(biāo)準(zhǔn)輸出(/dev目錄中的內(nèi)容)

還是回到標(biāo)題,重定向就是把標(biāo)準(zhǔn)的輸入或者輸出更改成其他的方式,請(qǐng)參看如下例子?
或者等同于

            #ls /dev 1>filename                                  #注意:"1"和">"中間沒(méi)有空格


          

?

以上命令會(huì)把命令的標(biāo)準(zhǔn)輸出重新定向到一個(gè)文件filename,而不是顯示到屏幕上,如果不指明文件標(biāo)識(shí)符,系統(tǒng)默認(rèn)的就是1, 因此1可以省略

如果把上面例子重的">"改成">>"則表示把輸出追加到filename文件的末尾,如果文件不存在則創(chuàng)建它。如下

            #ls /dev >>filename


          

?

也可以把標(biāo)準(zhǔn)錯(cuò)誤重新定向到文件

            #ls -qw  /dev  2>filename


          

?

顯然 -qw是一個(gè)錯(cuò)誤參數(shù),通常會(huì)在顯示器上報(bào)告一個(gè)錯(cuò)誤信息,但由于把2標(biāo)準(zhǔn)錯(cuò)誤(stderr)重新定向到了文件filename,因此顯示器沒(méi)有錯(cuò)誤信息,而信息寫(xiě)到了文件里面

以下命令是把標(biāo)準(zhǔn)輸出和錯(cuò)誤都定向到文件

            #ls /dev &>filename


          

?

"&"在這里代表標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,這里無(wú)論是正常輸出還是錯(cuò)誤信息都寫(xiě)到filename中了。

重新定義標(biāo)準(zhǔn)輸入,輸出,和錯(cuò)誤的文件標(biāo)識(shí)符

重新定義文件標(biāo)識(shí)符可以用i>&j命令,表示把文件標(biāo)識(shí)符i重新定向到j(luò),你可以把"&"理解為"取地址"

請(qǐng)看以下例子

            #exec 5>&1


          

?

表示把文件標(biāo)識(shí)符5定向到標(biāo)準(zhǔn)輸出,這個(gè)命令通常用來(lái)臨時(shí)保存標(biāo)準(zhǔn)輸入。

同樣標(biāo)準(zhǔn)輸入也是可以重新定向的,請(qǐng)參考下面例子

            # grep search-word <filename或者grep search-word 0<filename


          

?

一般來(lái)說(shuō)grep命令在給定文件中搜索字符串,以上命令把文件filename作為grep命令的標(biāo)準(zhǔn)輸入,而不是從鍵盤(pán)輸入。

前面曾經(jīng)提到,系統(tǒng)為每一個(gè)打開(kāi)的文件指定一個(gè)文件標(biāo)識(shí)符以便系統(tǒng)對(duì)文件進(jìn)行跟蹤,那么默認(rèn)的文件標(biāo)識(shí)符是什么呢?答案是0,也就是標(biāo)準(zhǔn)輸入,或者可以說(shuō)從鍵盤(pán)輸入。當(dāng)然這個(gè)文件標(biāo)識(shí)符也可以自己指定,請(qǐng)參考下面例子

            #echo 123456789 >filename   把字符串寫(xiě)到文件filename中

#exec 3<>filename           把文件filename打開(kāi),并指定文件標(biāo)識(shí)符為3

#read -n 4 <&3              從文件中讀4個(gè)字符,句柄已經(jīng)指到第四個(gè)字符末尾

#echo -n . >&3              在第5個(gè)字符處寫(xiě)一個(gè)點(diǎn),覆蓋第5個(gè)字符,-n表示不換行

#exec 3>&-	          關(guān)閉文件標(biāo)識(shí)符3


          

?

現(xiàn)在cat filename文件的結(jié)果就成了1234.6789

命令j<>filename表示把文件打開(kāi),并指明文件標(biāo)識(shí)符為j?
"&-"表示關(guān)閉文件標(biāo)識(shí)符

有關(guān)關(guān)閉文件標(biāo)識(shí)符的操作請(qǐng)參考下面

            n<&- 關(guān)閉輸入文件標(biāo)識(shí)符n

0<&-或<&- 關(guān)閉標(biāo)準(zhǔn)輸入stdin

n>&- 關(guān)閉輸出文件標(biāo)識(shí)符n

1>&-或>&-關(guān)閉標(biāo)準(zhǔn)輸出stdout


          

?

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

            2.	:> filename 或者 > filename


          

?

表示把文件filename設(shè)置成空,也就是清空文件內(nèi)容,如果文件不存在,則創(chuàng)建一個(gè)空文件,(等同于touch命令) :表示一個(gè)空輸出,兩個(gè)命令的唯一區(qū)別就是>filename不是在所有shell都可以正常工作的。

?

參考資料

  • Jeffrey Friedl, Mastering Regular Expressions, O'Reilly

  • Mendel Cooper, Advanced Bash-Scripting Guide

  • Michael Jang, Mastering Redhat 9

關(guān)于作者

樊奇,IBM TSS China Beijing ,Xseries eServer 工程師,對(duì)Linux 很有興趣。通過(guò)? fanqi@cn.ibm.com 可以和聯(lián)系。電話(huà):010 84981188-6856

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 奎屯市| 顺义区| 康乐县| 藁城市| 平湖市| 洱源县| 合山市| 阳春市| 兰溪市| 宁安市| 铁力市| 八宿县| 南康市| 观塘区| 卢氏县| 汉沽区| 阳信县| 梓潼县| 盐山县| 永城市| 比如县| 江华| 北宁市| 宝丰县| 防城港市| 阿图什市| 依兰县| 绥芬河市| 孟津县| 浦江县| 吉林省| 五原县| 抚顺县| 晋中市| 财经| 高台县| 留坝县| 江门市| 长乐市| 麦盖提县| 米脂县|