CentOS7远程登录(ssh)无法使用别名(alias)的解决方法

alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
alias命令的基本格式为alias [word[='command']], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。

# alias 
# alias cp
# alias cp='cp -i'
# \ls   跳过别名执行,如果没有别名执行也不报错

但在使用alias的过程中还有一些问题需要注意。如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:

shopt -s expand_aliases

设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。

  

再就是,如果在脚本中的同一行内,先定义alias,接着马上使用该alias是会产生错误的。原因就是bash在解释执行脚本过程中,每次读取至少一行命令,alias展开就是在读取时进行的,读取之后(alias展开也完成了)才开始执行命令(当然,还会有参数扩展等其他操作)。由于进行alias展开时该行的alias命令尚未执行,所以其中的alias就不会被展开。举个例子吧,

shopt -s expand_aliases
alias ll='ls -lh'; alias e='exit'; ll; e

执行该脚本,会发现ls 和exit命令均未被执行,错误提示ll和e命令未找到。所以,脚本中,alias命令最好单独成行。

同样的问题也出现在组合命令中,比如while, for循环等结构,

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

猜你喜欢

转载自blog.csdn.net/zhangjunli/article/details/108506908
今日推荐