別名解決Unix操作系統(tǒng)方案
今天我要介紹關于別名的知識。它是典型Unix操作系統(tǒng)管理員使用命令解決的方案之一。這種解決方案僅在某些外殼中受支持——別名提供了將給定的字符串展開為特定命令的簡單方法。
別名在 Korn (ksh)、Bourne-Again SHell (bash)、TENEX C shell (tcsh) 和 Z shell (zsh) 外殼中受支持,當您希望設置命令的特定選項,同時仍然支持其他選項時,別名提供了也許是最簡單的方法。顧名思義,您可以將一個命令用作另一個命令的別名,或者為帶有附加選項的同一個命令提供別名。別名從您鍵入的內(nèi)容展開為其展開形式。
例如,一個常用的別名是ll,它調(diào)用等效的 ls -l(ll 通常稱為長清單 (long listing))。每當用戶鍵入ll,就會直接將其替換為展開形式,因此:$ ll a* 在執(zhí)行前展開為:$ ls -l a*。 命令行選項也仍然有效,換句話說,$ ll -a 展開為:$ ls -l -a。 還可以為現(xiàn)有命令設置別名;假設將 -F 選項添加到所有 ls 命令,這樣,$ ls 將展開為:$ ls -F。 要設置別名,請使用內(nèi)置的外殼 alias 語句,并在引號中指定所需的展開形式。例如,要設置前面詳細描述的 ll 的展開形式,可使用:$ alias ll='ls -l'。
比如ps 命令,它在基于SVR4 和基于BSD 的Unix操作系統(tǒng) 主機上是不同的。 在 BSD 上指定別名 $ alias ps='ps -o pid,ppid,command' 而在SVR4 主機上指定別名 $ alias ps='ps -opid,ppid,cmd 現(xiàn)在,在這兩個系統(tǒng)對 ps 的不同操作方式的限制下,您獲得了ps 產(chǎn)生的標準輸出。和前面一樣,您可以繼續(xù)添加更多選項;例如,在安裝了該別名的任一個平臺上請求所有進程,添加 -A 選項就是這樣一種情況。
同樣以ps為例,您可以創(chuàng)建別名ps-all 來輸出所有進程列表,并根據(jù)需要為每種平臺設置相應的展開形式。
設置這些別名的最佳位置是在登錄期間執(zhí)行的外殼初始化腳本中,例如 .ksh、.profile 或 .bashrc。您可以在這些腳本中執(zhí)行同樣的Unix操作系統(tǒng)檢查,以驗證要啟用哪些別名。如果希望提供適用于所有用戶的全局解決方案,則應將別名定義放在公開可用的文件中(例如放在 /etc or /usr/local 中),并設置用戶初始化腳本以獲得別名定義來源。
別名機制最適合于您希望設置單個命令的命令行選項的情況,雖然也可以使用它們來將給定的命令展開為一組命令或管道。這樣削弱了為展開形式中除最后一個命令以外的其他任何命令指定附加參數(shù)的能力。
對于處理此類包裝,外殼中的內(nèi)聯(lián)函數(shù)可能更為適合。 大多數(shù)外殼都支持函數(shù),這些函數(shù)本質上是微型腳本,您可以在其中放置命令和其他外殼腳本元素以執(zhí)行特定的任務。它們是主外殼定義中的函數(shù),支持許多完整外殼腳本所具有的相同功能,如命令行參數(shù)。對于支持別名無法在其中工作的某些命令和組合,對命令行參數(shù)的支持非常關鍵。
例如,killall 命令最基本的功能是終止所有與特定字符串匹配的命令。在Solaris 上,killall 命令存在,但是將其用作關閉過程的一部分以終止所有進程。設想Unix操作系統(tǒng)在 Solaris 主機上意外調(diào)用 killall 命令以關閉所有 Apache 進程,沒想到卻實際上關閉了系統(tǒng)!
如果要在所有主機上使用相同的名稱或使用不同的名稱實現(xiàn)按名稱終止進程的預期結果,并消除不希望的和可能代價高昂的錯誤,同時擴展本身并不支持該選項的Unix操作系統(tǒng)的功能??墒褂胟ill 命令將 KILL 信號發(fā)送到每個匹配進程。在命令行上,您可以通過一系列管道實現(xiàn)等效的功能(使用 KILL 信號)。
提供killall 命令的替代 $ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9 該命令的關鍵部分是提供給 grep的字符串和ps 輸出中包含所需進程 ID 的列。上面的例子對 Solaris 主機和大多數(shù) SVR4 Unix操作系統(tǒng)變種有效。
我們這樣就介紹玩了關于別名的知識。
【編輯推薦】