深度解析Unix操作系統(tǒng)文本操作
最初Unix操作系統(tǒng)剛出來的時(shí)候,人們不大熟悉這種新的操作系統(tǒng),但他們很快找到了適當(dāng)?shù)那腥朦c(diǎn),大學(xué)中的研究人員需要一種像樣的文本處理環(huán)境。因?yàn)樵谀莻€(gè)時(shí)候,計(jì)算機(jī)的處理速度和內(nèi)存容量有限,所以程序必須很小,并且相對比較簡單。
這樣就產(chǎn)生了Unix操作系統(tǒng)中著名的設(shè)計(jì)思想:“一組工具協(xié)同工作,以便完成一項(xiàng)任務(wù)”。通過 Unix操作系統(tǒng)管道將幾種很小的、但功能強(qiáng)大的文本處理工具組合在一起,可以對文本進(jìn)行各種方式的轉(zhuǎn)換和操作。
對文本進(jìn)行各種操作
在開始使用Unix操作系統(tǒng) 的各種文本實(shí)用程序操作文本之前,需要了解如何獲得文本。并且在進(jìn)行這項(xiàng)工作之前,需要了解Unix操作系統(tǒng) 的標(biāo)準(zhǔn)輸入/輸出 (I/O) 流。標(biāo)準(zhǔn) C 庫(因而,每個(gè)Unix操作系統(tǒng) 程序)定義了三種標(biāo)準(zhǔn)流:輸入、輸出和錯(cuò)誤。有時(shí)將它們稱為 stdin、stdout 和 stderr,這是在所有 C 程序中用來表示它們的全局變量。
當(dāng)您在 Shell 中使用 > 操作符將程序輸出重定向到文件時(shí),就可以將它的標(biāo)準(zhǔn)輸出 (stdout) 流發(fā)送到這個(gè)文件。例如:ls > this-dir 將 ls 的輸出發(fā)送到一個(gè)名為 this-dir 的文件。
當(dāng)您在 Shell 中使用 < 操作符將程序輸入重定向到文件時(shí),就可以將該文件中的內(nèi)容輸入到該程序的標(biāo)準(zhǔn)輸入 (stdin) 流。例如:sort < this-dir 可以從名為 this-dir 的文件中讀取內(nèi)容,并將其作為 sort 命令的輸入。
通過 Unix操作系統(tǒng)管道將幾種很小的、但功能強(qiáng)大的文本處理工具組合在一起,可以對文本進(jìn)行各種方式的轉(zhuǎn)換和操作。另一個(gè)常用于重定向標(biāo)準(zhǔn)流的操作符是“|”(管道)操作符,它可以將左側(cè)程序的標(biāo)準(zhǔn)輸出流連接到右側(cè)程序的標(biāo)準(zhǔn)輸入流。例如:ls | sort 和前面的兩個(gè)示例完成相同的任務(wù),并且無需臨時(shí)文件,ls 的輸出直接進(jìn)入 sort 命令。
如果您仔細(xì)觀察,那么可能會(huì)發(fā)現(xiàn),前面的這些示例中并沒有出現(xiàn)標(biāo)準(zhǔn)錯(cuò)誤 (stderr) 流。與標(biāo)準(zhǔn)輸出流一樣,可以對 stderr 進(jìn)行重定向或使用管道進(jìn)行傳輸,但是您需要告訴 Shell 您希望處理 stderr 而不是 stdout。
可以使用 2> 操作符將標(biāo)準(zhǔn)錯(cuò)誤流重定向到文件。在處理生成有用的錯(cuò)誤輸出的命令時(shí),您經(jīng)常會(huì)看到這個(gè)操作符,比如用于編譯Unix操作系統(tǒng) 程序的 make 工具:make 2> build-errors。
這個(gè)命令運(yùn)行了 make,并將任何錯(cuò)誤信息發(fā)送到 build-errors 文件。與之類似,您可以使用 2| 將 stderr 通過管道傳遞到另一個(gè)程序。
在熟悉了這些之后,我們就應(yīng)該理解通過 Unix操作系統(tǒng)管道將幾種很小的、但功能強(qiáng)大的文本處理工具組合在一起,可以對文本進(jìn)行各種方式的轉(zhuǎn)換和操作的意思了。
【編輯推薦】