首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

8.6  别名

别名是一种名称,shell将其翻译成另一个(通常较长的)名字或者(复杂的)命令。通过替换字符串中简单命令的第1个字,别名可用来定义新的命令。这些别名通常放在初始化文件~/.bashrc(bash)或者/.tcshrc(tcsh)中,这样在交互式子shell中就可以使用这些别名。

在bash中,内置命令alias的语法如下:

alias [name[=value]]

在tcsh中语法如下:

alias [name[ value]]

在bash语法中,等号左右没有空格符。如果values中包含空格符或者制表符,必须将引号之间的value括起来。与tcsh别名不同,bash别名不接受value中来自命令行的参数。如果需要使用参数的话,就要使用bash函数。

别名并不替换自己,这避免了在处理如下别名时可能存在的无限递归:

$ alias 1s='1s -F'

别名可以嵌套。在非交互式shell(也就是shell脚本)中别名是被禁止的。使用命令alias可以列出当前所有别名的列表。要想查看某个特殊名称的别名,可以在alias命令后面加上该名称。用unalias内置命令删除别名。

当输入不带任何参数的alias内置命令时,shell显示所有已定义别名的列表:

$ alias

alias 11='1s -l'

alias 1='1s -ltr'

alias 1s='1s -F'

alias zap='rm -i'

大部分Linux发布版都定义了一些别名。使用alias命令可查看哪些别名是有效的。可以在相应的初始化文件中删除不想要的别名。

8.6.1  别名中的单引号和双引号

当别名中包含变量时,在别名语法中选择单引号还是双引号是非常重要的。如果将value用双引号引起来,那么当创建该别名时,value中的任何变量都将扩展。如果将value用单引号引起来,在使用该别名之前变量都不会被扩展。下面的示例演示了两者的区别。

PWD关键字变量保存了当前工作目录的路径名。alex在其主目录下工作时,创建了两个别名。因为当他创建dirA别名时使用了双引号,所以当他创建这个别名时,shell将用当前工作目录的值替换该变量。命令alias dirA显示了dirA别名的内容,同时还可以看出,已经执行了替换:

$ echo $PWD

/home/alex

$ alias dirA="echo Working directory is $PWD"

$ alias dirA

alias dirA='echo Working directory is /home/alex'

alex创建dirB时使用了单引号,这样就可以阻止shell展开$PWD变量。alias dirB命令显示了dirB别名仍然保持了未展开的$PWD变量:

$ alias dirB='echo Working directory is $PWD'

$ alias dirB

alias dirB='echo Working directory is $PWD'

在创建了dirA和dirB别名之后,alex使用cd命令使cars成为工作目录,并输入两个别名分别作为命令。使用双引号创建的别名所显示的是创建该别名的目录的名称(这是错误的),而别名dirB显示了正确的工作目录名称:

$ cd cars

$ dirA

Working directory is /home/alex

$ dirB

Working directory is /home/alex/cars

 

如何阻止shell调用别名? 

提示

shell只检查那些简单的、未经引用的命令,看其是否为别名。那些相对或者绝对路径名的命令和引用命令都不被检查。当想输入一条有别名的命令,但又不想使用该别名时,那么就在命令前加上反斜杠,或者执行该命令的绝对路径名,或者输入如下的命令:./command

8.6.2  别名示例

使用下面的别名,当输入r时,重复前一条命令,或者输入r abc重复以abc开头的最后一个命令行:

$ alias r='fc -s'

如果经常使用命令ls -ltr,那么就可以创建一个别名,当输入l时将替换成ls -ltr:

$ alias 1='ls -ltr'      

$ l

total 41          

-rw-r--r-- 1 alex group 30015 Mar  1 2004  flute.ps

-rw-r-----  1 alex group   3089  Feb 11 2005  XTerm.ad

-rw-r--r-- 1 alex group   641 Apr   1 2005  fixtax.icn

-rw-r--r-- 1 alex group   484 Apr   9 2005  maptax.icn

drwxrwxr-x 2 alex group 1024 Aug   9 17:41  Tiger

drwxrwxr-x 2 alex group 1024 Sep 10 11:32 testdir

-rwxr-xr-x 1 alex group   485 Oct 21 08:03  floor

drwxrwxr-x 2 alex group 1024 Oct 27 20:19  Tesst_Emacs

别名的另一个用处是防止犯错。在下面的示例中,当用户输入命令zap时,将替换成rm实用程序的交互式版本:

$ alias zap='rm -i'

$ zap f*

rm: remove 'fixtax.icn'? n

rm: remove 'flute.ps'? n

rm: remove 'floor'? n

 -i选项使得rm要求用户确认每个将要删除的文件,以帮助用户避免偶然删除错误文件。还可以使用命令alias rm=’rm -i’将rm作为命令rm -i的别名。

下面的示例中的别名使得用户每次输入ll命令时,shell用ls -l替换,而当使用ls时,用ls –F代替:

$ alias 1s='ls -F'

$ alias 11='ls -l'

$ 11

total 41

drwxrwxr-x 2 alex group  1024 Oct 27 20:19 Test_Emacs/

drwxrwxr-x 2 alex group  1024 Aug 9 17:41 Tiger/

-rw-r----- 1 alex group 3089 Feb 11 2005 XTerm.ad

-rw-r--r—-  1 alex group  641 Apr 1 2005 fixtax.icn

-rw-r--r—-  1 alex group 30015 Mar 1 2004 flute.ps

-rwxr-xr-x 1 alex group   485 Oct 21 08:03 floor*

-rw-r--r—-  1 alex group   484 Apr 9 2005 maptax.icn

drwxrwxr-x 2 alex group  1024 Sep 10 11:32 testdir/

-F选项使ls在目录名末尾打印斜杠(/),在可执行文件名末尾打印星号(*)。在这个示例中,代替别名ll(ls -l)的字符串本身也包含一个别名(ls)。当shell用别名的值替换掉别名时,shell查看替换字符串的第1个字,看其是否为别名。在前面的示例中,替换串包含了别名ls,因此出现了第2次替换,其最终结果是ls -F -l。(为了避免循环,替换文本中的ls,尽管还是别名,但是没有进行二次展开。)

当给出一个不带=value或者value字段的别名列表时,内置命令alias的响应是显示每个已定义别名的值。如果某个别名没有定义的话,内置命令alias就会报告一个错误:

$ alias 11 1 1s zap wx

alias 11='1s -l'

alias 1='1s -ltr'

alias 1s='1s -F'

alias zap='rm -i'

bash: alias: wx: not found

在别名命令前加上反斜杠(\)就可以避免别名替换:

$ \ls

Test_Emacs XTerm.ad flute.ps maptax.icn

Tiger    fixtax.icn floor     testdir

因为用别名的值替换掉别名名称不会改变命令行的其余部分,所以任何参数仍然会被执行的命令接收:

$ 11 f*

-rw-r--r-- 1 alex   group     641 Apr 1 2005 fixtax.icn

-rw-r--r-- 1 alex   group   30015 Mar 1 2004 flute.ps

-rwxr-xr-x 1 alex   group     485 Oct 21 08:03 floor*

使用内置命令unalias可以删除别名。当删除zap之后,内置命令alias将不再显示这个别名,再使用这个别名将会导致错误消息:

$ unalias zap

$ alias

alias 11='1s -l'

alias 1='1s -ltr'

alias 1s='1s -F'

$ zap maptax.icn

bash: zap: command not found

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论