在 dash 中,函数和变量似乎位于不同的命名空间中:
fn(){
fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function
这是特定于 dash 的功能还是 POSIX 保证?
答案1
一个保证:
2.9.5 功能定义命令
函数是用户定义的名称,用作简单命令来调用具有新位置参数的复合命令。功能通过“功能定义命令”来定义。[...]
该函数名为fname;应用程序应确保它是一个名称(请参阅 XBD 名称)并且不是特殊内置实用程序的名称。实现可以允许函数名称中的其他字符作为扩展名。实现应为函数和变量维护单独的名称空间。
答案2
变量和函数驻留在破折号中的不同命名空间中,这也由POSIX:
实现应为函数和变量维护单独的名称空间。
除此之外,默认情况下,变量具有全局范围。某些 shell(例如 bash、ksh 和 zsh)提供local
关键字来声明仅具有本地作用域的函数中的变量。
所以,是的,您所看到的行为是由 POSIX 保证的。
早期提案中对函数的描述基于函数应该像微型 shell 脚本一样运行的概念;那是,除了共享变量,执行环境的大多数元素的行为应该像新的执行环境一样,[..]
[..] 函数内的局部变量被考虑并包含在另一个早期提案中(由特殊的内置函数控制
local
),但是被删除因为它们不适合为函数开发的简单模型,并且因为有人反对添加另一个不属于历史实践的新的特殊内置函数。实现应保留标识符local
(以及typeset
KornShell 中使用的 ),以防该标准的未来版本采用此局部变量机制。
(强调我的)