POSIX shell 中函数和变量的独立命名空间

POSIX shell 中函数和变量的独立命名空间

在 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 保证的。

POSIX 还没有标准化 local,然而

早期提案中对函数的描述基于函数应该像微型 shell 脚本一样运行的概念;那是,除了共享变量,执行环境的大多数元素的行为应该像新的执行环境一样,[..]

[..] 函数内的局部变量被考虑并包含在另一个早期提案中(由特殊的内置函数控制local),但是被删除因为它们不适合为函数开发的简单模型,并且因为有人反对添加另一个不属于历史实践的新的特殊内置函数。实现应保留标识符local(以及typesetKornShell 中使用的 ),以防该标准的未来版本采用此局部变量机制。

(强调我的)

相关内容