shell 脚本中使用自定义的alias别名

摘自:https://blog.csdn.net/cscrazybing/article/details/41285287

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选项:

交互模式下alias 扩展默认是开启的,脚本模式下默认是关闭的 

alias 扩展的名称是 expand_aliases 

1
shopt -s expand_aliases

(执行 help shopt 可以查看该shell内置命令的帮助信息)

CommandDesc
shopt -s opt_name Enable (set) opt_name
shopt -u opt_name Disable (unset) opt_name
shopt opt_name Show current status of opt_name
 
 

设置这个选项,可以在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:  命令.
 
posted @ 2024-05-07 19:23  LiuYanYGZ  阅读(208)  评论(0编辑  收藏  举报