對(duì)話 Unix:您好,shell!
UNIX?系統(tǒng)中一項(xiàng)最奇特和突出的特性就是其命令行功能 。您只需輸入包含一定邏輯關(guān)系的少量文本,即可使用命令行來將有限的 UNIX 實(shí)用工具組合成無限的即時(shí)可用的數(shù)據(jù)轉(zhuǎn)換 。
例如,要在當(dāng)前工作目錄下的文件夾層次結(jié)構(gòu)中查找獨(dú)特文件名的列表,您可在 shell 提示符下輸入以下命令:
find . -type f -print | sort | uniq
該命令行中組合了三種不同的實(shí)用工具:
find 對(duì)指定目錄進(jìn)行深度搜索,在本例中,是對(duì)從 . 或 點(diǎn)(代表當(dāng)前工作目錄)開始的文件系統(tǒng)進(jìn)行搜索并生成滿足給定條件的所有項(xiàng)的名稱 。這里,-type f 告訴 find 只查找文本文件 。
sort,顧名思義,將對(duì)列表進(jìn)行處理并生成按字母排序的新列表 。
uniq(讀做 “unique),掃描列表,比較列表中的相鄰元素,以去除任何重復(fù)項(xiàng) 。例如,假設(shè)您具有以下列表:
清單 1. 列表示例
Groucho
Groucho
Chico
Chico
Groucho
Harpo
Zeppo
Zeppo
uniq 可將列表精簡為:
清單 2. uniq 命令
Groucho
Chico
Groucho
Harpo
Zeppo
但是,如果首先對(duì) Marx Brothers 的初始列表進(jìn)行排序(在連續(xù)運(yùn)行中對(duì)多次出現(xiàn)的名稱進(jìn)行重排),運(yùn)行 uniq 會(huì)生成以下結(jié)果:
清單 3. 運(yùn)行 uniq
Chico
Groucho
Harpo
Zeppo
要了解 find、sort 和 uniq 的更多擴(kuò)展特性,請(qǐng)參閱您的 UNIX 系統(tǒng)中每種實(shí)用工具的 man 頁 。
輸入數(shù)據(jù)、輸出數(shù)據(jù)和全部數(shù)據(jù)
獨(dú)立使用 find 時(shí),總是以文件系統(tǒng)的內(nèi)容作為輸入數(shù)據(jù) 。但是 sort 和 uniq 則需要從標(biāo)準(zhǔn)輸入設(shè)備 (stdin) 請(qǐng)求數(shù)據(jù)輸入 。多數(shù)情況下,您會(huì)使用鍵盤作為 stdin:例如,您需要輸入要排序的數(shù)據(jù)行 。
默認(rèn)情況下,find 在標(biāo)準(zhǔn)輸出設(shè)備(stdout,通常是您的終端窗口)上打印結(jié)果 。sort 和 uniq 都將輸出打印到 stdout 。
為了說明 stdin 和 stdout,您可在終端窗口中輸入以下文本(假設(shè)前面的百分號(hào) (%) 為您的 shell 提示符):
清單 4. stdin 和 stdout
% sort
mustache
horn
hat
Control-D
sort 從 stdin 讀取您輸入的三行文本,并對(duì)其進(jìn)行排序,然后將結(jié)果寫出到 stdout 。圖 1 所示為從命令行運(yùn)行 sort 和多數(shù) Unix 命令行實(shí)用工具的示意圖 。
圖 1. 典型 UNIX 命令行實(shí)用工具從 stdin 讀取并寫入到 stdout
某些實(shí)用工具,例如 find 并不從 stdin 讀取內(nèi)容 。它們是從系統(tǒng)資源(例如文件系統(tǒng)或系統(tǒng)內(nèi)核)讀取需要處理的數(shù)據(jù),然后將結(jié)果寫入到 stdout 。要直觀查看 find 的工作方式,請(qǐng)參見以下的圖 2 。
圖 2. 某些實(shí)用工具從系統(tǒng)資源讀取數(shù)據(jù)并將結(jié)果寫入到 stdout
除了使用 stdin 和 stdout 之外,UNIX 命令還將生成的錯(cuò)誤消息輸出到一種特殊出口以便進(jìn)行診斷,該出口通常并不是強(qiáng)制的 。此出口稱為標(biāo)準(zhǔn)錯(cuò)誤設(shè)備(通常簡稱為 stderr) 。圖 3 所示為運(yùn)行實(shí)用工具的簡單命令行 。
圖 3. Unix 命令生成錯(cuò)誤并輸出到特殊通道,即標(biāo)準(zhǔn)錯(cuò)誤設(shè)備
如圖 3 中所示,多數(shù) UNIX 命令從終端讀取輸入,將結(jié)果發(fā)送到終端,并將錯(cuò)誤打印到終端上 。默認(rèn)情況下,除非另行指定,您的終端既是 stdin 的數(shù)據(jù)源,也是 stdout 和 stderr 的輸出目標(biāo) 。
數(shù)據(jù)傳輸
不過,您可更改 stdin 的源以及 stdout 和 stderr 的目標(biāo) 。您可強(qiáng)制 stdin 從文本文件、設(shè)備(比如連接到計(jì)算機(jī)的探頭)或網(wǎng)絡(luò)連接中進(jìn)行讀取 。類似地,您可將輸出結(jié)果發(fā)送到文件、設(shè)備或網(wǎng)絡(luò)連接 。在 UNIX 中,所有資源都被視作文件,因此某種源或目標(biāo)很容易作為另外的源或目標(biāo)而被接受或產(chǎn)生 。
推薦閱讀
- UNIX系統(tǒng)簡單維護(hù)管理
- 對(duì)話 UNIX,第 12 部分: 自己動(dòng)手完成項(xiàng)目
- 對(duì)話 UNIX,第 8 部分: UNIX 進(jìn)程
- 對(duì)話 UNIX,第 11 部分: 漫談 UNIX 文件系統(tǒng)
- 對(duì)話 UNIX: 第 10 部分,定制您的 Shell
- 對(duì)話 UNIX,第 9 部分: 正則表達(dá)式
- 對(duì)話 UNIX,第 6 部分: 通過腳本實(shí)現(xiàn)操作的自動(dòng)化
- 提升UNIX中文件系統(tǒng)使用效率
- SCO UNIX基礎(chǔ)講座--第十一講:TCP/IP 管理
- 基本配置及操作 SCO UNIX學(xué)習(xí)寶典
