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