今天我要介紹關於別名的知識。它是典型Unix操作系統管理員使用命令解決的方案之一。這種解決方案僅在某些外殼中受支持——別名提供了將給定的字符串展開為特定命令的簡單方法。
別名在 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'。
比如ps 命令,它在基於SVR4 和基於BSD 的Unix操作系統 主機上是不同的。 在 BSD 上指定別名 $ alias ps='ps -o pid,ppid,command' 而在SVR4 主機上指定別名 $ alias ps='ps -opid,ppid,cmd 現在,在這兩個系統對 ps 的不同操作方式的限制下,您獲得了ps 產生的標准輸出。和前面一樣,您可以繼續添加更多選項;例如,在安裝了該別名的任一個平台上請求所有進程,添加 -A 選項就是這樣一種情況。
同樣以ps為例,您可以創建別名ps-all 來輸出所有進程列表,並根據需要為每種平台設置相應的展開形式。
設置這些別名的最佳位置是在登錄期間執行的外殼初始化腳本中,例如 .ksh、.profile 或 .bashrc。您可以在這些腳本中執行同樣的Unix操作系統檢查,以驗證要啟用哪些別名。如果希望提供適用於所有用戶的全局解決方案,則應將別名定義放在公開可用的文件中(例如放在 /etc or /usr/local 中),並設置用戶初始化腳本以獲得別名定義來源。
別名機制最適合於您希望設置單個命令的命令行選項的情況,雖然也可以使用它們來將給定的命令展開為一組命令或管道。這樣削弱了為展開形式中除最後一個命令以外的其他任何命令指定附加參數的能力。
對於處理此類包裝,外殼中的內聯函數可能更為適合。 大多數外殼都支持函數,這些函數本質上是微型腳本,您可以在其中放置命令和其他外殼腳本元素以執行特定的任務。它們是主外殼定義中的函數,支持許多完整外殼腳本所具有的相同功能,如命令行參數。對於支持別名無法在其中工作的某些命令和組合,對命令行參數的支持非常關鍵。
例如,killall 命令最基本的功能是終止所有與特定字符串匹配的命令。在Solaris 上,killall 命令存在,但是將其用作關閉過程的一部分以終止所有進程。設想Unix操作系統在 Solaris 主機上意外調用 killall 命令以關閉所有 Apache 進程,沒想到卻實際上關閉了系統!
如果要在所有主機上使用相同的名稱或使用不同的名稱實現按名稱終止進程的預期結果,並消除不希望的和可能代價高昂的錯誤,同時擴展本身並不支持該選項的Unix操作系統的功能。可使用kill 命令將 KILL 信號發送到每個匹配進程。在命令行上,您可以通過一系列管道實現等效的功能(使用 KILL 信號)。
提供killall 命令的替代 $ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9 該命令的關鍵部分是提供給 grep的字符串和ps 輸出中包含所需進程 ID 的列。上面的例子對 Solaris 主機和大多數 SVR4 Unix操作系統變種有效。
我們這樣就介紹玩了關於別名的知識。