Bash别名本质上是一个简称, 缩写, 这可避免键入过长的命令序列. 例如,如果我们添加 alias lm="ls -l | more" 这一行到文件~/.bashrc file里, 然后每次在命令行键入lm 将会自动被替换成ls -l | more. 这使用户在命令行不必键冗长的命令序列也避免了记忆复杂的命令及众多选项. 设置alias rm="rm -i" (交互式删除)可以使你犯下错误时不必过度悲伤,它能避免你不小心删除重要文件.
在脚本里,别名机制不是非常的有用. 如果把别名机制想像成C预处理器的某些功能将会非常好,比如宏扩展,但是,不幸的是Bash不能在别名中扩展参数. [1] 而且,别名不能在“混合型的结构”中使用,比如if/then语句, 循环, 和函数. 还有一个限制是别名不能递归地扩展. 大多数情况Almost invariably, 我们想让别名完成的工作都能被函数更高效地完成.
例子 24-1. 脚本中的别名
1 #!/bin/bash 2 # alias.sh 3 4 shopt -s expand_aliases 5 # 必须设置这个选项,否则脚本不会扩展别名功能. 6 7 8 # 首先, 来点有趣的. 9 alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."' 10 Jesse_James 11 12 echo; echo; echo; 13 14 alias ll="ls -l" 15 # 可以使用单引号(')或双引号(")来定义一个别名. 16 17 echo "Trying aliased \"ll\":" 18 ll /usr/X11R6/bin/mk* #* 别名工作了. 19 20 echo 21 22 directory=/usr/X11R6/bin/ 23 prefix=mk* # 看通配符会不会引起麻烦. 24 echo "Variables \"directory\" + \"prefix\" = $directory$prefix" 25 echo 26 27 alias lll="ls -l $directory$prefix" 28 29 echo "Trying aliased \"lll\":" 30 lll # 详细列出在/usr/X11R6/bin目录下所有以mk开头的文件. 31 # 别名能处理连接变量 -- 包括通配符 -- o.k. 32 33 34 35 36 TRUE=1 37 38 echo 39 40 if [ TRUE ] 41 then 42 alias rr="ls -l" 43 echo "Trying aliased \"rr\" within if/then statement:" 44 rr /usr/X11R6/bin/mk* #* 引起错误信息! 45 # 别名不能在混合结构中使用. 46 echo "However, previously expanded alias still recognized:" 47 ll /usr/X11R6/bin/mk* 48 fi 49 50 echo 51 52 count=0 53 while [ $count -lt 3 ] 54 do 55 alias rrr="ls -l" 56 echo "Trying aliased \"rrr\" within \"while\" loop:" 57 rrr /usr/X11R6/bin/mk* #* 在这儿,别名也不会扩展. 58 # alias.sh: line 57: rrr: command not found 59 let count+=1 60 done 61 62 echo; echo 63 64 alias xyz='cat $0' # 脚本打印自身内容. 65 # 注意是单引号(强引用). 66 xyz 67 # 虽然Bash的文档它是不会工作的,但好像它是可以工作的. 68 # 69 # 70 # 然而,就像 Steve Jacobson指出, 71 #+ 参数"$0"立即扩展成了这个别名的声明. 72 73 exit 0 |
例子 24-2. unalias: 设置和删除别名
1 #!/bin/bash 2 # unalias.sh 3 4 shopt -s expand_aliases # 打开别名功能扩展. 5 6 alias llm='ls -al | more' 7 llm 8 9 echo 10 11 unalias llm # 删除别名. 12 llm 13 # 引起错误信息,因为'llm'已经不再有效了. 14 15 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: command not found |
[1] | 但是, 别名好像能扩展位置参数. |