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

對(duì)話 UNIX: 掌握強(qiáng)大的命令行( 三 )


但是,如果您打算使用 bash 來(lái)處理多個(gè)文件,該怎么辦呢?cat file1 file2 file3 | bash 是一種可行的方法,這也許也是唯一的一種方法,因?yàn)樵?bash 中并不支持如 bash < file1 < file2 < file3 的語(yǔ)法 。
而且,bash 無(wú)法將輸出重定向到多個(gè)目標(biāo) 。例如,您可從 bash 命令行中輸入指令 bighairyscript > ~/log | mail -s "Important stuff" team 。
但在相對(duì)較新的 shell 如 Z shell(zsh;請(qǐng)參閱參考資料)中,可以在同一命令行內(nèi)處理多個(gè)輸入和輸出 。例如,使用以下命令可將 stdout 保存到名為 log 的文件中并通過(guò)電子郵件發(fā)送給您自己:
清單 6. Z shell
zsh% bash < tellme > log | mail -s "Who you are" 'whoami'
bash: line 4: systemname: command not found
zsh% Your current login, working Directory, and system are...
strike
/home/strike
(短語(yǔ) “whoami運(yùn)行命令 whoami 并將該命令的結(jié)果插入到短語(yǔ)所在位置 。它類似于在運(yùn)行命令行的其他部分之前先運(yùn)行一條短小 shell 命令 。)
現(xiàn)在我們對(duì)上一條命令從左向右進(jìn)行分析 。bash 命令創(chuàng)建文件 log 并將在 tellme 文件中找到的命令的 stdout 發(fā)送給您自己 。由于 stderr 沒(méi)有通過(guò) > 或管道進(jìn)行定向,因此錯(cuò)誤消息將被打印到 stdout 。命令 file 等同于 cat > file 。)
Z shell 還可處理多個(gè)輸入重定向 。Z shell 命令行 cat < file1 < file2 < file3 等同于 cat file1 file2 file3 。顯然,原有語(yǔ)法較后者更加繁瑣,總的來(lái)說(shuō),多個(gè) stdout 重定向要更加常用的多 。但是,如果您要運(yùn)行的實(shí)用工具不接受多個(gè)輸入?yún)?shù),則可使用 Z shell 的多個(gè)輸入重定向 。
Z shell 中還具有其他新特性,包括更好的 globbing(通配符匹配)、先進(jìn)的模式匹配和擴(kuò)展的命令自動(dòng)完成系統(tǒng),從而減少您在命令行中的字符輸入 。本系列中的后續(xù)兩篇文章將進(jìn)一步探討 Z shell 。
Shell 技巧
通過(guò)一些功能強(qiáng)大的命令行組合,能明顯提高您的工作效率 。這些命令可以在所有的 shell 中工作,而不僅僅是 zsh 。
使用 tar 為任何目錄創(chuàng)建包括符號(hào)鏈接在內(nèi)的完整副本:
tar cf - /path/to/original | 
 (mkdir -p /path/to/copy; cd /path/to/copy; tar xvf -)
第一個(gè) tar 命令將目錄 /path/to/original 進(jìn)行歸檔并將歸檔文件寫(xiě)到 stdout,創(chuàng)建 (c) 選項(xiàng)后面使用的連字符 (-) 表示 stdout 。括號(hào)中的命令為一個(gè) subshell:subshell 中的命令不會(huì)影響當(dāng)前 shell 的環(huán)境 。mkdir -p 創(chuàng)建指定目錄,包括任何需要?jiǎng)?chuàng)建的中間目錄;cd 命令則切換到新目錄 。第二個(gè) tar 命令從 stdin 讀取歸檔文件并進(jìn)行展開(kāi),展開(kāi) (x) 選項(xiàng)后面使用的連字號(hào)表示 stdin 。
要在保存命令序列的 stdout 同時(shí)進(jìn)行查看,可使用 less -O file。-O 選項(xiàng)會(huì)將 stdin 復(fù)制到指定的 file 中 。如下例所示:
sort /etc/aliases | less -Osorted
如果目錄中包含數(shù)千個(gè)文件,則您的 shell(包括 zsh,取決于文件數(shù)目及其名稱)可能無(wú)法使用通配符匹配來(lái)列舉出所有文件,因?yàn)槊钚型ǔ>哂幸欢ǖ淖址麛?shù)限制 。因此,類似以下 shell 腳本:
foreach i (*)
...
end
可能會(huì)執(zhí)行失敗 。(當(dāng)超出允許命令行長(zhǎng)度時(shí),您可能看到類似 Line length exceeded 的消息 。)如果出現(xiàn)此類錯(cuò)誤,可使用管道 xargs 實(shí)用工具 。xargs 命令可從管道中讀取數(shù)據(jù)并為每行讀取內(nèi)容運(yùn)行指定命令 。
例如,如果您要查找服務(wù)器上的所有引用 www.example.com 的網(wǎng)頁(yè),可使用以下命令行:
% find / -name '*HTML' -print
 | xargs grep -l 'www.example.com'
 | less -Opages
xargs 接收來(lái)自 find 的文件名并重復(fù)運(yùn)行 grep -l 以處理每個(gè)文件,而不論有多少個(gè)文件 。(grep -l 在發(fā)現(xiàn)一個(gè)匹配項(xiàng)之后即打印文件的名稱并停止在該文件中的進(jìn)一步匹配 。) less 允許您對(duì)結(jié)果進(jìn)行分頁(yè)并將列表保存在文件指定頁(yè)中 。命令結(jié)果為包含字符串“www.example.com的文件名列表 。

推薦閱讀