# 25. 別名
Bash `別名` 本質上不外乎是鍵盤上的快捷鍵,縮寫呢是避免輸入很長的命令串的一種手段.舉個例子, 在 [~/.bashrc](http://tldp.org/LDP/abs/html/sample-bashrc.html) 文件中包含別名 `lm="ls -l | more`, 而后每個命令行輸入的 lm [[1]](http://tldp.org/LDP/abs/html/aliases.html#FTN.AEN18669) 將會自動被替換成 `ls -l | more`. 這可以節省大量的命令行輸入和避免記住復雜的命令和選項. 設定別名 `rm="rm -i"` (交互的刪除模式) 防止無意的刪除重要文件,也許可以少些悲痛.
腳本中別名作用十分有限. 如果別名可以有一些 C 預處理器的功能會更好, 例如宏擴展, 但不幸的是 bash 別名中沒有擴展參數. [[2]](http://tldp.org/LDP/abs/html/aliases.html#FTN.AEN18676) 另外, 腳本在 "復合結構" 中并不能擴展自身的別名,例如 [if/then](http://tldp.org/LDP/abs/html/tests.html#IFTHEN), 循環和函數. 另一個限制是,別名不能遞歸擴展. 基本上是我們無論怎么喜歡用別名都不如函數 [function](http://tldp.org/LDP/abs/html/functions.html#FUNCTIONREF) 來的更有效.
樣例 25-1. 腳本中的別名
```
#!/bin/bash
# alias.sh
shopt -s expand_aliases
# 必須設置此選項, 否則腳本不能別名擴展.
# 首先來點好玩的東西.
alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
Jesse_James
echo; echo; echo;
alias ll="ls -l"
# 可以任意使用單引號 (') 或雙引號 (") 把別名括起來.
echo "Trying aliased \"ll\":"
ll /usr/X11R6/bin/mk* #* 別名可以運行.
echo
directory=/usr/X11R6/bin/
prefix=mk* # See if wild card causes problems.
echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
echo
alias lll="ls -l $directory$prefix"
echo "Trying aliased \"lll\":"
lll # 所有 /usr/X11R6/bin 文件清單以 mk 開始.
# 別名可以處理連續的變量 -- 包含 wild card -- o.k.
TRUE=1
echo
if [ TRUE ]
then
alias rr="ls -l"
echo "Trying aliased \"rr\" within if/then statement:"
rr /usr/X11R6/bin/mk* #* 結果報錯!
# 別名在復合的表達式中并沒有生效.
echo "However, previously expanded alias still recognized:"
ll /usr/X11R6/bin/mk*
fi
echo
count=0
while [ $count -lt 3 ]
do
alias rrr="ls -l"
echo "Trying aliased \"rrr\" within \"while\" loop:"
rrr /usr/X11R6/bin/mk* #* 這里的別名也沒生效.
# alias.sh: 行 57: rrr: 命令未找到
let count+=1
done
echo; echo
alias xyz='cat $0' # 列出了自身.
# 注意強引.
xyz
# 這看起來能工作,
#+ 盡管 bash 文檔不介意這么做.
#
# 然而, Steve Jacobson 指出,
#+ "$0" 參數的擴展在上面的別名申明后立刻生效.
exit 0
```
取消別名的命令刪除之前設置的別名.
樣例 25-2. unalias: 設置和取消一個別名
```
#!/bin/bash
# unalias.sh
shopt -s expand_aliases # 開啟別名擴展.
alias llm='ls -al | more'
llm
echo
unalias llm # 取消別名.
llm
# 'llm' 不再被識別后的報錯信息.
exit 0
bash$ ./unalias.sh
total 6
drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 .
drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 ..
-rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh
./unalias.sh: llm: 命令未找到
```
#### 注意
[[1]](http://tldp.org/LDP/abs/html/aliases.html#AEN18669) ... 作為命令行的第一個詞. 顯然別名只在命令的開始有意義.
[[2]](http://tldp.org/LDP/abs/html/aliases.html#AEN18676) 然而, 別名可用來擴展位置參數.
- 第一部分 初見shell
- 1. 為什么使用shell編程
- 2. 和Sha-Bang(#!)一起出發
- 2.1 調用一個腳本
- 2.2 牛刀小試
- 第二部分 shell基礎
- 3. 特殊字符
- 4. 變量與參數
- 4.1 變量替換
- 4.2 變量賦值
- 4.3 Bash弱類型變量
- 4.4 特殊變量類型
- 5. 引用
- 5.1 引用變量
- 5.2 轉義
- 6. 退出與退出狀態
- 7. 測試
- 7.1 測試結構
- 7.2 文件測試操作
- 7.3 其他比較操作
- 7.4 嵌套 if/then 條件測試
- 7.5 牛刀小試
- 8. 運算符相關話題
- 8.1 運算符
- 8.2 數字常量
- 8.3 雙圓括號結構
- 8.4 運算符優先級
- 第三部分 shell進階
- 10. 變量處理
- 10.1 字符串處理
- 10.1.1 使用 awk 處理字符串
- 10.1.2 參考資料
- 10.2 參數替換
- 11. 循環與分支
- 11.1 循環
- 11.2 嵌套循環
- 11.3 循環控制
- 11.4 測試與分支
- 12. 命令替換
- 13. 算術擴展
- 14. 休息時間
- 第五部分 進階話題
- 19. 嵌入文檔
- 20. I/O 重定向
- 20.1 使用 exec
- 20.2 重定向代碼塊
- 20.3 應用程序
- 22. 限制模式的Shell
- 23. 進程替換
- 26. 列表結構
- 25. 別名