这个网站说:“Shell 函数[比别名]更快。别名是在函数之后查找的,因此解析速度较慢。虽然别名更容易理解,但对于几乎所有用途,Shell 函数都优于别名。”
鉴于此(无论正确与否),shell 函数与独立 shell 脚本相比如何?其中一个是否比另一个有特殊优势,或者更适合某些类型的任务?
答案1
别名和函数之间的主要区别是别名不带参数,但函数带参数。当你写下类似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。