别名 vs 函数 vs 脚本

Wol*_*olf 39 shell bash alias function

这个站点说:“Shell 函数 [比别名] 更快。在函数之后查找别名,因此解析速度较慢。虽然别名更容易理解,但几乎在所有用途中,shell 函数都比别名更受欢迎。”

鉴于此(对与否),shell 函数与独立的 shell 脚本相比如何?一个比另一个有特别的优势,还是更适合某些类型的任务?

Gil*_*il' 54

别名和函数之间的主要区别在于别名不带参数¹,但函数带参数。当你写类似的东西时alias l='ls --color'l foo被扩展为ls --color foo; 你不能抓住foo别名扩展并用它做一些不同的事情,就像你可以用函数做的那样。另请参阅如何将参数传递给别名?.

函数之前查找别名:如果您有一个函数和一个别名foo,则foo调用别名。(如果别名foo被扩展,它会被暂时阻止,这会使事情变得alias ls='ls --color'正常。此外,您可以随时通过运行绕过别名\foo。)不过,我不希望看到可测量的性能差异。

函数和独立脚本具有大部分相似的功能;以下是我能想到的一些差异:

  • 一个函数在 shell 环境中运行;脚本在单独的进程中运行。因此,函数可以更改shell 环境:定义环境变量、更改当前目录等。独立脚本无法做到这一点。
  • 函数必须用您要在其中使用它的 shell 的语言编写。脚本可以用任何语言编写。
  • 函数在定义时加载。每次调用脚本时都会加载脚本。这有几个后果:
    • 如果您修改了一个脚本,您下次调用它时就会得到新版本。如果更改函数的定义,则必须重新加载定义。
    • 重负载系统上的函数速度更快。
    • 如果您有很多可能不会使用的功能,它们会占用内存。Ksh 和 zsh,但我认为不是 bash,有一种函数自动加载的形式。

介于函数和独立脚本之间的东西是您使用source.内置脚本阅读的脚本片段。像函数一样,它可以修改shell的环境,并且必须用shell的语言编写。就像脚本一样,它每次被调用时都会加载,而且不会很快。

¹ 是的,我知道,这不适用于 tcsh。

  • @chilicuil 为什么要定义每次调用函数时都重新定义函数的别名?为什么不一劳永逸地定义函数,这使得别名只是`alias mkcd=_mkcd`,这是毫无意义的,因为你可以首先调用函数`mkcd`? (2认同)