分类: 系统运维
2014-10-30 09:18:13
alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
alias命令的基本格式为alias [word[='command']], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。
如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:
1 |
shopt -s expand_aliases |
设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。
再就是,如果在脚本中的同一行内,先定义alias,接着马上使用该alias是会产生错误的。原因就是bash在解释执行脚本过程中,每次读取至少一行命令,alias展开就是在读取时进行的,读取之后(alias展开也完成了)才开始执行命令(当然,还会有参数扩展等其他操作)。由于进行alias展开时该行的alias命令尚未执行,所以其中的alias就不会被展开。举个例子吧,
1 2 |
shopt -s expand_aliases alias ll='ls -lh'; alias e='exit'; ll; e |
执行该脚本,会发现ls 和exit命令均未被执行,错误提示ll和e命令未找到。所以,脚本中,alias命令最好单独成行。
同样的问题也出现在组合命令中,比如while, for循环等结构,
1 2 3 4 5 6 7 8 9 10 11 12 |
shopt -s expand_aliases for i in `seq 1 10` do alias ll='ls -lh' ll # command ll not found. done for i in `seq 1 10` do alias ll='ls -lh' ll # now ok done |
类似地,在shell函数中alias也会出现同样的问题。事实上,shell中的函数只不过是一种特殊的、有名字和参数的、使用{}的组合命令,所以单行函数中’}’之前是必须要有分号的,就像普通的{}组合命令一样。之所以非单行函数不需要分号,是因为换行可以代替分号。
最后,bash中alias不可以使用位置参数(据说csh)是可以的,也就是说,不可以使用alias mkcd=’mkdir $1 && cd $1’这样的命令(这种命令允许你在alias中按照自己的意愿安排参数的位置,例如对于alias ll=’ls $1 -lh’,ll file被展开为ls file -lh,而不是简单的展开为ls -lh file)。如果在bash中确实需要这样做,就应该使用函数来完成,比如,function mkcd() { ‘mkdir $1 && cd $1; }.