本文介紹用於標准化界面以簡化在不同 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 的輸出。