日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對話 UNIX: 掌握強大的命令行( 二 )


更改進程數(shù)據(jù)的源和目標(biāo)被稱為重定向 。您可重定向 stdin 以從文件或其他源讀取數(shù)據(jù),還可分別對 stdout 和 stderr 重定向以將數(shù)據(jù)寫到終端窗口之外的其他位置 。在許多情況下,如前面所列出的初始 find 命令中,您還可重定向?qū)嵱霉ぞ咭詮钠渌ぞ呓邮蘸蜑樗鼈儺a(chǎn)生所需的數(shù)據(jù) 。這就是管道 (|) 的用途 。您可在命令中通過管道來生成進程鏈路,即將某條命令的數(shù)據(jù)發(fā)送到下一條命令,這類似于通過銅管將水從熱水器傳輸?shù)较词殖刂?。
圖 4 所示為 find . -type f -print | sort | uniq 命令的示意圖 。
圖 4. 通過管道進行鏈接的三個實用工具的示意圖
find 命令的 stdout 成為 uniq stdin,然后 uniq 的 stdout 又成為 sort 的 stdin 。最后,sort 將結(jié)果打印到其標(biāo)準(zhǔn)輸出設(shè)備,即所連接的終端窗口上 。這些命令的 stderr 未進行重定向,因此所有三個實用工具都會將錯誤消息打印到終端上 。(來自三個實用工具的錯誤消息會混在一起,但保持正確的順序 。)
如有需要,您可進一步擴展管道,將 uniq 的輸出重定向到另外的實用工具 。這只需使用另一個管道即可對轉(zhuǎn)換進行擴展 。例如,您可在命令之后附加 | less 以使用 less 對輸出結(jié)果進行分頁,或者您可添加 | wc -l 以統(tǒng)計獨特文件名的數(shù)目 。(wc 為 Word count 的首字母縮寫,wc 可統(tǒng)計字符、單詞和行數(shù) 。)
此外,您還可使用 > 來將整個命令序列的輸出結(jié)果保存到一個文件中(這將覆蓋現(xiàn)有的文件內(nèi)容) 。您可使用 >> 以將命令輸出結(jié)果附加 到現(xiàn)有文件之后(如果文件不存在,則創(chuàng)建新文件) 。
另一個有用的重定向是 < 。圖 5 所示為如何重定向 stdin 以從文件中進行讀取 。命令 sort 從指定文件中讀取單詞列表并按字母順序進行排序 。
圖 5. 重定向標(biāo)準(zhǔn)輸入以讀取文件內(nèi)容
您常常會需要捕獲 stdout 和 stderr 。例如,如果您正在運行大型的數(shù)據(jù)挖掘任務(wù),則可能要檢查執(zhí)行過程中的中間輸出以及可能出現(xiàn)的任何錯誤 。您可使用重定向語法的一些變種來實現(xiàn)該功能:|&, >&, >>& 可分別對 stdout 和 stderr 實現(xiàn)管道、創(chuàng)建、附加功能 。圖 6 所示為如何將 stdout 和 stderr 合并到單一的輸出流 。
圖 6. 合并標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤設(shè)備
Z shell 介紹
包括 Bourne shell (bash) 和 Korn shell (ksh) 在內(nèi)的多數(shù)現(xiàn)代 Unix shell 都支持這里提到的重定向功能,盡管在這些 shell 中具體語法可能存在細微差別 。(請查看您的 shell 文檔以了解詳細信息) 。
重定向中的多數(shù)操作符在所有的 Unix shell 中已經(jīng)連續(xù)使用了至少 25 年 。但是,多數(shù) shell 并沒有提供新的特性或采用新方式來應(yīng)用重定向 。例如,多數(shù) shell 只能將輸入重定向到單個文件,因此您必須使用如 tee 等實用工具來輸出到多個目標(biāo) 。(類似于水管工人使用的 T 型管 (Tee),tee 只支持單個或兩個輸出 。)這里提供一個使用 bash 作為 shell(命令行解釋器)的示例:
清單 5. bash 示例
bash$ ls
tellme
bash$ cat tellme
echo Your current login, working Directory, and system are...
whoami
pwd
systemname
bash$ bash < tellme |& tee log
Your current login and working directory are...
strike
/home/strike
bash: systemname: command not found
bash$ ls
tellme log
bash$ cat log
Your current login and working directory are
strike
/home/strike
bash: systemname: command not found
盡管 UNIX shell 具有較高的專用性,且通常使用鍵盤進行交互,但某些 shell 如 bash 等也能從文件讀取輸入內(nèi)容 。(實際上,stdin 也是一種文件 。)在前面的片段中,短語 bash < commands 告訴 bash 執(zhí)行在文件 tellme 中找到的命令列表 。短語 |&tee log 將 bash 的 stdout 和 stderrto 通過管道重定向到 tee 實用工具,后者將其 stdin 打印到 stdout 和 文件 log 中 。

推薦閱讀