25. 别名

Bash 别名 本质上不外乎是键盘上的快捷键,缩写呢是避免输入很长的命令串的一种手段.举个例子, 在 ~/.bashrc 文件中包含别名 lm="ls -l | more, 而后每个命令行输入的 lm [1] 将会自动被替换成 ls -l | more. 这可以节省大量的命令行输入和避免记住复杂的命令和选项. 设定别名 rm="rm -i" (交互的删除模式) 防止无意的删除重要文件,也许可以少些悲痛.

脚本中别名作用十分有限. 如果别名可以有一些 C 预处理器的功能会更好, 例如宏扩展, 但不幸的是 bash 别名中没有扩展参数. [2] 另外, 脚本在 “复合结构” 中并不能扩展自身的别名,例如 if/then, 循环和函数. 另一个限制是,别名不能递归扩展. 基本上是我们无论怎么喜欢用别名都不如函数 function 来的更有效.

样例 25-1. 脚本中的别名

  1. #!/bin/bash
  2. # alias.sh
  3. shopt -s expand_aliases
  4. # 必须设置此选项, 否则脚本不能别名扩展.
  5. # 首先来点好玩的东西.
  6. alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
  7. Jesse_James
  8. echo; echo; echo;
  9. alias ll="ls -l"
  10. # 可以任意使用单引号 (') 或双引号 (") 把别名括起来.
  11. echo "Trying aliased \"ll\":"
  12. ll /usr/X11R6/bin/mk* #* 别名可以运行.
  13. echo
  14. directory=/usr/X11R6/bin/
  15. prefix=mk* # See if wild card causes problems.
  16. echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
  17. echo
  18. alias lll="ls -l $directory$prefix"
  19. echo "Trying aliased \"lll\":"
  20. lll # 所有 /usr/X11R6/bin 文件清单以 mk 开始.
  21. # 别名可以处理连续的变量 -- 包含 wild card -- o.k.
  22. TRUE=1
  23. echo
  24. if [ TRUE ]
  25. then
  26. alias rr="ls -l"
  27. echo "Trying aliased \"rr\" within if/then statement:"
  28. rr /usr/X11R6/bin/mk* #* 结果报错!
  29. # 别名在复合的表达式中并没有生效.
  30. echo "However, previously expanded alias still recognized:"
  31. ll /usr/X11R6/bin/mk*
  32. fi
  33. echo
  34. count=0
  35. while [ $count -lt 3 ]
  36. do
  37. alias rrr="ls -l"
  38. echo "Trying aliased \"rrr\" within \"while\" loop:"
  39. rrr /usr/X11R6/bin/mk* #* 这里的别名也没生效.
  40. # alias.sh: 行 57: rrr: 命令未找到
  41. let count+=1
  42. done
  43. echo; echo
  44. alias xyz='cat $0' # 列出了自身.
  45. # 注意强引.
  46. xyz
  47. # 这看起来能工作,
  48. #+ 尽管 bash 文档不介意这么做.
  49. #
  50. # 然而, Steve Jacobson 指出,
  51. #+ "$0" 参数的扩展在上面的别名申明后立刻生效.
  52. exit 0

取消别名的命令删除之前设置的别名.

样例 25-2. unalias: 设置和取消一个别名

  1. #!/bin/bash
  2. # unalias.sh
  3. shopt -s expand_aliases # 开启别名扩展.
  4. alias llm='ls -al | more'
  5. llm
  6. echo
  7. unalias llm # 取消别名.
  8. llm
  9. # 'llm' 不再被识别后的报错信息.
  10. exit 0
  11. bash$ ./unalias.sh
  12. total 6
  13. drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 .
  14. drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 ..
  15. -rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh
  16. ./unalias.sh: llm: 命令未找到

注意

[1] … 作为命令行的第一个词. 显然别名只在命令的开始有意义.
[2] 然而, 别名可用来扩展位置参数.