任何别名都相当于函数吗?

任何别名都相当于函数吗?
  1. 任何别名是否等同于一个函数,即别名的每次出现都可以用函数的名称替换,并且每次调用该函数时的函数名称都可以用别名替换?

  2. 如果我是正确的,则任意别名按以下形式定义:

    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 "$@"; }

现在,让我们使用fooandmyfun来定义一个函数:

$ 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.

相关内容