首页 > 解决方案 > 局部变量实现

问题描述

我一直在使用鱼壳,最近我与一位同事就局部变量进行了交谈。显然,Bash 不支持局部变量,只使用环境变量在进程之间传递动态数据。局部变量是否也只是环境变量,但还有一些额外的东西?我很好奇鱼是如何产生这种行为的。

标签: environment-variablesfish

解决方案


Bash 不支持局部变量

这不是真的。Bash(和其他 shell,包括 dash - 它是它拥有的少数 POSIX 扩展之一)具有local创建局部变量的关键字。它们只是默认为全局,而鱼默认为本地。

此外,当您说“环境变量”时,您的意思是“导出”变量,这需要在 posixy shell 中明确的“导出”步骤,以及在 fish 中的“-x”或“--export”标志set

IE。这里有两个不同的事情在起作用——这个变量是否只在这个函数/块/任何东西中可用,而不是在外部,以及它是否传递给children,包括外部进程。

局部变量是否也只是环境变量,但还有一些额外的东西?

非导出变量一些。它们没有被赋予操作系统的setenv功能,因此它不会将它们复制到子进程。

当块结束时,局部变量被删除。在实践中,这可以通过将它们放在堆栈上并“弹出”顶部来很好地完成。

请注意,至少在鱼类中,这些概念是完全正交的:

您可以拥有本地导出的变量(带有set -lx),它们将被传递给外部命令并复制到函数(因此它们获得自己的本地版本),但在函数结束时被删除。这些对于临时更改某些内容很有用——例如,仅为函数设置 $PATH,或在调用某些内容时覆盖 $EDITOR。

并且您可以拥有全局未导出的变量,这些变量可以通过函数访问,但不能通过外部命令访问。这些对于像 $fish_function_path 这样的 shell 设置很有用,它对外部工具没有用,或者 $COLUMN,如果导出它甚至可能会破坏外部工具(因为它们开始读取它而不是自己检查终端大小)。


推荐阅读