>代码可重用性:Bash函数不返回任何东西;它们只产生输出流。捕获该流并将其分配给变量或将其作为参数传递的每个合理方法都需要一个SubShell,它会中断对外部作用域的所有分配。因此,可重用函数的库不可行,因为你不能要求函数将其结果存储在名称作为参数传递的变量中(除非另有说明)。通过执行eval backflips)。
>范围:Bash有一个简单的局部范围系统,大致类似于“动态范围”(例如Javascript,elisp)。函数查看调用者的本地(像Python的“nonlocal”关键字),但是不能访问调用者的位置参数(如果启用了extdebug,则通过BASH_ARGV除外)。可重用函数不能保证没有命名空间冲突,除非你使用奇怪的命名规则使冲突不可能。如果实现期望作用于来自帧n-3的可能被n-2处的可重用函数覆盖的变量名的函数,这尤其是个问题。 Ksh93可以通过使用“function name {…}”语法声明函数来使用更常见的词法作用域规则(Bash不能,但仍然支持此语法)。
> Closures:在Bash中,函数本身总是全局的(有“文件范围”),所以没有闭包。函数定义可以嵌套,但这些不是闭包,虽然它们看起来非常相同。函数不是“passable”(first-class),并且没有匿名函数(lambdas)。事实上,没有什么是“passable”,特别是数组。 Bash使用严格的按值语义(除了魔术别名hack)。
>有更多的并发症涉及:subshells;导出函数; “函数折叠”(定义或重新定义其他函数或自身的函数);陷阱(和它们的继承);和函数与stdio交互的方式。不要咬新手,不理解这一切。 Shell函数完全f ***。
资料来源:http://mywiki.wooledge.org/BashWeaknesses
Shell“库”的一个示例是基于Redhat的系统上的/etc/rc.d/functions。此文件包含sysV init脚本中常用的函数。