- 論壇徽章:
- 1
|
[轉(zhuǎn)載]常用文件重定向命令
噹噹噹~~~ 上課囉~~~ ^_^
前面提到:$ cat < file > file 之後原本有內(nèi)容的檔案結(jié)果卻被洗掉了﹗
要理解這一現(xiàn)像其實(shí)不難,這只是 priority 的問(wèn)題而已:
* 在 IO Redirection 中,stdout 與 stderr 的管道會(huì)先準(zhǔn)備好,才會(huì)從 stdin 讀進(jìn)資料。
也就是說(shuō),在上例中,> file 會(huì)先將 file 清空,然後才讀進(jìn) < file ,
但這時(shí)候檔案已經(jīng)被清空了,因此就變成讀不進(jìn)任何資料了...
哦~~~ 原來(lái)如此~~~~ ^_^
那... 如下兩例又如何呢?
$ cat <> file
$ cat < file >> file
嗯... 同學(xué)們,這兩個(gè)答案就當(dāng)練習(xí)題囉,下節(jié)課之前請(qǐng)交作業(yè)﹗
好了,I/O Redirection 也快講完了,sorry,因?yàn)槲乙仓恢肋@麼多而已啦~~~ 嘻~~ ^_^
不過(guò),還有一樣?xùn)|東是一定要講的,各位觀眾(請(qǐng)自行配樂(lè)~!#@!$%) :
---- 就是 pipe line 也﹗
談到 pipe line ,我相信不少人都不會(huì)陌生:
我們?cè)诤芏?command line 上?吹降" | "符號(hào)就是 pipe line 了。
不過(guò),究竟 pipe line 是甚麼東東呢?
別急別急... 先查一下英漢字典,看看 pipe 是甚麼意思?
沒(méi)錯(cuò)﹗它就是"水管"的意思...
那麼,你能想像一下水管是怎麼一根接著一根的嗎?
又,每根水管之間的 input 跟 output 又如何呢?
嗯??
靈光一閃:原來(lái) pipe line 的 I/O 跟水管的 I/O 是一模一樣的:
* 上一個(gè)命令的 stdout 接到下一個(gè)命令的 stdin 去了﹗
的確如此... 不管在 command line 上你使用了多少個(gè) pipe line ,
前後兩個(gè) command 的 I/O 都是彼此連接的﹗(恭喜:你終於開(kāi)竅了﹗ ^_^ )
不過(guò)... 然而... 但是... ... stderr 呢?
好問(wèn)題﹗不過(guò)也容易理解:
* 若水管漏水怎麼辦?
也就是說(shuō):在 pipe line 之間,前一個(gè)命令的 stderr 是不會(huì)接進(jìn)下一命令的 stdin 的,
其輸出,若不用 2> 導(dǎo)到 file 去的話(huà),它還是送到監(jiān)視器上面來(lái)﹗
這點(diǎn)請(qǐng)你在 pipe line 運(yùn)用上務(wù)必要注意的。
那,或許你又會(huì)問(wèn):
* 有辦法將 stderr 也餵進(jìn)下一個(gè)命令的 stdin 去嗎?
(貪得無(wú)厭的家夥﹗)
方法當(dāng)然是有,而且你早已學(xué)過(guò)了﹗ ^_^
我提示一下就好:
* 請(qǐng)問(wèn)你如何將 stderr 合併進(jìn) stdout 一同輸出呢?
若你答不出來(lái),下課之後再來(lái)問(wèn)我吧... (如果你臉皮真夠厚的話(huà)...)
或許,你仍意尤未盡﹗或許,你曾經(jīng)碰到過(guò)下面的問(wèn)題:
* 在 cm1 | cm2 | cm3 ... 這段 pipe line 中,若要將 cm2 的結(jié)果存到某一檔案呢?
若你寫(xiě)成 cm1 | cm2 > file | cm3 的話(huà),
那你肯定會(huì)發(fā)現(xiàn) cm3 的 stdin 是空的﹗(當(dāng)然啦,你都將水管接到別的水池了﹗)
聰明的你或許會(huì)如此解決:
cm1 | cm2 > file ; cm3 < file
是的,你的確可以這樣做,但最大的壞處是:這樣一來(lái),file I/O 會(huì)變雙倍﹗
在 command 執(zhí)行的整個(gè)過(guò)程中,file I/O 是最常見(jiàn)的最大效能殺手。
凡是有經(jīng)驗(yàn)的 shell 操作者,都會(huì)盡量避免或降低 file I/O 的頻率。
那,上面問(wèn)題還有更好方法嗎?
有的,那就是 tee 命令了。
* 所謂 tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去。
因此,上面的命令行可以如此打:
cm1 | cm2 | tee file | cm3
在預(yù)設(shè)上,tee 會(huì)改寫(xiě)目標(biāo)檔案,若你要改為增加內(nèi)容的話(huà),那可用 -a 參數(shù)達(dá)成。
基本上,pipe line 的應(yīng)用在 shell 操作上是非常廣泛的,尤其是在 text filtering 方面,
凡舉 cat, more, head, tail, wc, expand, tr, grep, sed, awk, ... 等等文字處理工具,
搭配起 pipe line 來(lái)使用,你會(huì)驚覺(jué) command line 原來(lái)是活得如此精彩的﹗
常讓人有"眾裡尋他千百度,驀然回首,那人卻在燈火闌珊處﹗"之感... ^_^
....
好了,關(guān)於 I/O Redirection 的介紹就到此告一段落。
若日後有空的話(huà),再為大家介紹其它在 shell 上好玩的東西﹗bye... ^_^
網(wǎng)中人
2003-11-19 @taiwan |
|