任何别名是否等同于一个函数,即别名的每次出现都可以用函数的名称替换,并且每次调用该函数时的函数名称都可以用别名替换?
如果我是正确的,则任意别名按以下形式定义:
alias myalias=blahblah
以上述形式定义的别名是否始终等同于定义为的函数
myfun () { blahblah $@ }
?
如果不是,别名相当于什么函数?
谢谢。
答案1
正如精美手册告诉我们的那样,别名几乎完全被函数取代。函数几乎可以做别名可以做的任何事情,并且能够做更多的事情,因为它们接受可以按任意顺序使用的参数。
函数不能做的就是阻止其参数的扩展。这意味着使用别名的唯一原因是设置不扩展的函数调用。
alias funny='set -f; _funny'
_funny(){ set +f ; do_something_with_unexpanded_args ;}
现在您可以运行funny *
并查看*
当前目录中的文件而不是文件列表。
答案2
NO 函数始终等同于给定的别名,因为:
$ alias foo=bar
+ alias foo=bar
$ myfun () { bar "$@"; }
现在,让我们使用foo
andmyfun
来定义一个函数:
$ foo () { blah "$@"; }
$ myfun () { blah "$@"; }
foo
和会发生什么myfun
?
$ type -a foo bar myfun
+ type -a foo bar myfun
foo is aliased to `bar'
bar is a function
bar ()
{
blah "$@"
}
myfun is a function
myfun ()
{
blah "$@"
}
显然,假定与别名等效的函数被重新定义,但别名不受影响。
对于大多数其他情况,myfun
相当于foo
.