Chinaunix首页 | 论坛 | 博客
  • 博客访问: 361256
  • 博文数量: 161
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-13 11:04
文章分类

全部博文(161)

文章存档

2015年(15)

2014年(144)

2013年(2)

我的朋友

分类: 系统运维

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; }.

Tags: .
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
阅读(903) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~