標準化您的 UNIX 命令列工具(轉)

ba發表於2007-08-16
標準化您的 UNIX 命令列工具(轉)[@more@]  本文介紹用於標準化介面以簡化在不同 UNIX® 系統之間移動的方法。如果您管理多種 UNIX 系統(特別是在異構環境中),則最艱鉅的任務可能是在不同環境之間切換並執行不同的任務,同時還必須考慮系統之間的所有差異。本文並不介紹特定的差異,而是研究能夠提供相容層(或包裝)以支援一致環境的方法。
關於本系列

典型的 UNIX® 管理員擁有一套經常用於輔助管理過程的關鍵實用工具、訣竅和系統。存在各種用於簡化不同過程的關鍵實用工具、命令列鏈和指令碼。其中一些工具來自於作業系統,而大部分的訣竅則來源於長期的經驗積累和減輕系統管理員工作壓力的要求。本系列文章主要專注於最大限度地利用各種 UNIX 環境中可用的工具,包括簡化異構環境中的管理任務的方法。

差異和問題

如果您使用多種 UNIX 主機,特別是每種主機都支援不同的 UNIX 風格(Berkeley Software Distribution (BSD)、UNIX System Release 4 (VSVR4) 等)或版本,您也許發現自己要花大量的時間來檢查和確定自己所在的主機型別,以便能夠適應系統操作方式的變化。

例如,ps 命令在基於 BSD 和基於 SVR4 的 UNIX 主機上,分別需要不同的命令列選項來獲得大致相同的資訊(有關更多細節,請參閱 系統管理員工具包: 程式管理技巧)。平臺之間還存在更廣泛的差異。有時,這種差異是命令名稱發生了更改;Linux® 提供 adduser 命令,而 Solaris 則提供 useradd 命令。

就標準化而言,有多種方法可供您採用。

您可以選擇對主要平臺(例如 Solaris)進行標準化,並在其他平臺上提供等效命令的包裝以匹配 Solaris 標準。
也可以選擇對為所使用的任務提供最佳組合的命令集進行標準化,挑選您喜歡的命令併為特定平臺上不存在的命令構建包裝。
您可以建立自己的一套執行特定任務的指令碼(包括您自己用於 ls、ps 等常用工具的替代指令碼),以便它們生成您想要的資訊。這樣做有點危險,原因是它意味著您可能從未使用原始命令,從而可能在您的指令碼不可用時導致潛在的問題。
如何具體實現各個命令的包裝以提供一個相容或唯一的層,這取決於您是嘗試簡單地為功能相同的替代命令提供一個公認名稱,還是需要構建一個或多個命令的包裝以獲得等效的結果。可能的解決方案有三種:

別名——這種解決方案僅在某些外殼中受支援——別名提供了將給定的字串展開為特定命令的簡單方法。
外殼函式——大多數現代外殼都支援這種解決方案——外殼函式使您能夠建立更復雜的序列,但是由於它們作為內建函式執行,在差異相當小時可能更為實用。
外殼指令碼——當您要構建的包裝特別複雜時,更好的解決方案是使用外殼指令碼,您可以代替原始命令呼叫這些指令碼。使用外殼指令碼,您可以更創造性地處理替代,甚至為另一個命令提供完全由外殼指令碼驅動的替代。
讓我們研究一下每種可能的解決方案和一些可透過此方法來進行模擬的示例命令。

使用別名

別名在 Korn (ksh)、Bourne-Again SHell (bash)、TENEX C shell (tcsh) 和 Z shell (zsh) 外殼中受支援,當您希望設定命令的特定選項,同時仍然支援其他選項時,別名提供了也許是最簡單的方法。顧名思義,您可以將一個命令用作另一個命令的別名,或者為帶有附加選項的同一個命令提供別名。別名從您鍵入的內容展開為其展開形式。

例如,一個常用的別名是 ll,它呼叫等效的 ls -l(ll 通常稱為長清單 (long listing))。每當使用者鍵入 ll,就會直接將其替換為展開形式,因此:$ ll a* 在執行前展開為:$ ls -l a*。

命令列選項也仍然有效,換句話說,$ ll -a 展開為:$ ls -l -a。

還可以為現有命令設定別名;假設將 -F 選項新增到所有 ls 命令,這樣,$ ls 將展開為:$ ls -F。

要設定別名,請使用內建的外殼 alias 語句,並在引號中指定所需的展開形式。例如,要設定前面詳細描述的 ll 的展開形式,可使用:$ alias ll='ls -l'。

別名在以下情況下最為有用:您希望使用 base 命令並容易地指定附加選項,同時仍然允許設定特定於平臺的選項。

一個很好的例子就是 ps 命令,它在基於 SVR4 和基於 BSD 的 UNIX 主機上是不同的。在本系列的第一篇文章中,請參閱 系統管理員工具包: 程式管理技巧 ——這篇文章解釋瞭如何使用 ps 的選項來獲得相似的清單。您可以結合別名使用那些選項,而不會影響您指定附加選項的能力。例如,在 BSD 上,您將如清單 1 所示指定別名。

清單 1. 在 BSD 上指定別名
$ alias ps='ps -o pid,ppid,command'

而在 SVR4 主機上,您將如清單 2 所示建立別名。

清單 2. 在 SVR4 上指定別名
$ alias ps='ps -opid,ppid,cmd

現在,在這兩個系統對 ps 的不同操作方式的限制下,您獲得了 ps 產生的標準輸出。和前面一樣,您可以繼續新增更多選項;例如,在安裝了該別名的任一個平臺上請求所有程式,新增 -A 選項就是這樣一種情況。這會在 BSD(在此示例中為 Mac OS X)上產生類似於清單 3 的輸出。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-960523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章