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

編寫Linux實(shí)用程序的藝術(shù)( 二 )


設(shè)想一下,如果大多數(shù)程序都具有排序功能,但是有些僅支持按詞法排序,而其他一些僅支持按數(shù)字排序,另外一些甚至支持關(guān)鍵字選擇而不是對整行排序,那將是一件多么令人沮喪的事情 。起碼,這也是惱人的 。
當(dāng)您發(fā)現(xiàn)某個(gè)問題需要解決時(shí),應(yīng)嘗試將問題分解為多個(gè)部分,不要重復(fù)那些其他實(shí)用程序中已經(jīng)存在的部分 。您對允許配合現(xiàn)有工具使用的工具關(guān)注得越多,您的實(shí)用程序就越有可能保持有用 。
也許您需要編寫多個(gè)程序 。完成專門任務(wù)的最佳途徑通常是編寫一兩個(gè)實(shí)用程序,再用一些線索將它們聯(lián)系起來,而不是編寫單個(gè)程序來解決整件事情 。使用 20 行的 shell 腳本來將新的實(shí)用程序與現(xiàn)有工具結(jié)合起來是很理想的 。如果嘗試一次解決整個(gè)問題,隨之而來的第一個(gè)變更就可能要求您全盤重新考慮 。
我偶爾需要從數(shù)據(jù)庫生成兩列或三列的輸出 。編寫一個(gè)程序在單個(gè)列中生成輸出,然后結(jié)合使用一個(gè)對輸出進(jìn)行分列的程序,這樣通常會更有效率 。組合這兩個(gè)實(shí)用程序的 shell 腳本本身是臨時(shí)性的,單獨(dú)的實(shí)用程序比這個(gè)腳本的使用壽命更長 。
有些實(shí)用程序服務(wù)于非常專一的需要 。針對一個(gè)包含大量內(nèi)容的目錄,如果 ls 的輸出非??斓貪L出屏幕,這可能是因?yàn)槠渲杏幸粋€(gè)文件具有非常長的文件名,從而迫使 ls 僅對輸出使用單個(gè)列 。使用 more 來對輸出分頁會花一些時(shí)間 。為什么不像下面這樣就按長度對行排序,然后通過 tail 來管道輸出結(jié)果呢?
清單 1. 世間能找到的最小實(shí)用程序 sl
#/usr/bin/perl -w
print sort { length $a <=> length $b } <>;


清單 1 中的腳本確切地就做一件事情 。它不接受任何選項(xiàng),因?yàn)樗恍枰x項(xiàng);它僅關(guān)心行的長度 。歸功于 Perl 便利的 <> 表達(dá)方式,這個(gè)小實(shí)用程序既適用于標(biāo)準(zhǔn)輸入,也適用于命令行指定的文件 。

成為一個(gè)過濾器
幾乎所有實(shí)用程序都最適合想像為過濾器,盡管有一些非常有用的實(shí)用程序不符合這個(gè)模型 。(例如,某個(gè)程序在執(zhí)行計(jì)數(shù)時(shí)可能非常有用,盡管它作為過濾器工作得并不好 。僅接受命令行參數(shù)作為輸入并潛在地產(chǎn)生復(fù)雜輸出的程序可能非常有用 。)然而,大多數(shù)實(shí)用程序都應(yīng)該作為過濾器來工作 。根據(jù)慣例,過濾器對文本的行起作用 。大多數(shù)過濾器都應(yīng)該支持多個(gè)輸入文件 。
記住實(shí)用程序需要在命令行和腳本中運(yùn)行 。有時(shí),理想的行為會稍有不同 。例如,大多數(shù)版本的 ls 都會在向終端寫出時(shí)自動將輸入排序到多個(gè)列中 。grep 的默認(rèn)行為是在指定多個(gè)文件的情況下打印從其中找到匹配項(xiàng)的那個(gè)文件名稱 。這樣的差別應(yīng)該與用戶希望的實(shí)用程序工作方式有關(guān),而不是與其他事項(xiàng)有關(guān) 。例如,舊版本的 GNU bc 在啟動時(shí)顯示強(qiáng)迫性的版權(quán)標(biāo)記 。請不要那樣做 。讓您的實(shí)用程序僅做它應(yīng)該做的事情 。
實(shí)用程序喜歡生活在管道中 。管道允許實(shí)用程序?qū)W⒂谧约旱墓ぷ?,而不是去關(guān)注旁枝末節(jié) 。為了生活在管道中,實(shí)用程序需要從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),然后向標(biāo)準(zhǔn)輸出寫出數(shù)據(jù) 。如果您希望處理記錄,那么您最好能夠使每一行成為一個(gè)“記錄” 。諸如 sort 和 join 之類的現(xiàn)有程序已經(jīng)在那樣考慮了 。它們將會因?yàn)槟@樣做而感謝您 。
我偶爾使用這樣一個(gè)實(shí)用程序,它針對一個(gè)文件樹反復(fù)調(diào)用其他程序 。這充分利用了標(biāo)準(zhǔn)的 UNIX 實(shí)用程序過濾器模型,但是該模型僅適用于讀取輸入然后寫出輸出的實(shí)用程序;不能將它用于就地操作或接受輸入輸出文件名的實(shí)用程序 。
可以使用標(biāo)準(zhǔn)輸入來運(yùn)行的大多數(shù)程序也完全可以針對單個(gè)文件或一組文件運(yùn)行 。注意,可以證明這樣違背了反對重復(fù)工作的規(guī)則;顯而易見,這可以通過將 cat 的輸出饋送給該系列中的下一個(gè)程序來解決 。然而這在實(shí)踐中似乎是合理的 。

推薦閱讀