天天看點

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

本節書摘來自異步社群《unix程式設計環境》一書中的第5章,第5.8節,作者:【美】brian w. kernighan , rob pike著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

我們在第1章提到您的系統可以有一個news指令,用以報告使用者社團方面的資訊。大部分系統都提供新聞服務,盡管指令名和指令細節有所不同。這裡給出一個news指令,不是要代替原有的本地指令,而旨在說明在shell裡編寫這樣一個程式是多麼地容易。比較兩個news指令的實作會是件有趣的事情。

程式利用了一個基本事實,即各個新聞項目是分開存放的,每個檔案包含一個新聞項目,存放在特定的目錄下,譬如/usr/news。news(我們自己的news程式)将/usr/news目錄裡的檔案和你的注冊目錄(.news_time)中下一個作為時間戳的檔案進行比較。為便于調試,我們用“.”代替新聞檔案和.news_time兩者的目錄;在使用時,可以友善地修改為/usr/news目錄。

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

touch的功能是把參數檔案的最後修改時間改為目前時間,而不改動檔案本身。為調試友善,我們隻列印新聞檔案的名字,而不列印檔案内容。循環遇到.news_time便終止,是以所列檔案都是比.news_time新的檔案。注意,case語句中的符号*可以與/比對,而/是不會出現在檔案名模式中的。

如果.news_time不存在,會出現什麼情況?

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

毫無響應,說明程式有錯,這一錯誤的發生是因為如果ls指令找不到檔案,它會在列印現有檔案有關資訊之前,在标準輸出上給出錯誤資訊。不可否認這是一個缺陷—診斷資訊應該列印在标準錯誤輸出上—不過我們可以識别循環中的問題,通過重定向标準錯誤輸出到标準輸出使所有版本同樣地工作,進而避開這個問題。(這一問題在更新版本中已經得到适當處理,但是我們仍然将它保留下來,作為一個如何應付小麻煩的示例。)

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

我們必須将ifs設定為換行符,以免下面的資訊被分為3個單獨的詞:

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

news必須列印新聞檔案,而不是僅僅列印檔案名。發送者和發送時間往往是有用的資訊,是以可以使用set指令和ls -1指令在前面列印标題:

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

這是一個shell中程式和資料互交換的例子。set不接收參數是因為它的參數-rwxrwxrwx以減号開始,與選項相混淆。一個簡易可行的修改方法是在參數前加上一個字元作為字首:

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

這是一個可行的格式,它在給出檔案名的同時給出了作者和日期資訊。

下面是news指令的最後版本:

《UNIX程式設計環境》——5.8 news指令:社團服務資訊

标題中附加的換行符将新聞項逐條分行列印。第一個ifs的值隻有一個換行符,是以第一個ls指令産生的資訊not found(如果有的話)被作為單個參數處理。下一個指派将ifs置為空格符,是以第二個ls的輸出被分成若幹個參數。

練習5-27 在news中增加選項 -n(notify),用于報告新聞項而不列印,并且不改變.news_time。可以把這個新的news放在.profile檔案中。

練習5-28 把上一練習的news的設計和實作與系統中類似指令作個比較。