局部变量实现

Ant*_*osa 0 environment-variables fish

我已经在使用鱼壳了一段时间,最近我和同事就局部变量进行了交谈。显然,Bash不支持局部变量,仅使用环境变量在进程之间传递动态数据。局部变量是否也只是环境变量,但还有一些额外的内容?我对鱼如何造成这种行为感到好奇。

fah*_*aho 5

Bash不支持局部变量

这不是真的。Bash(以及其他包含破折号的shell-它是为数不多的POSIX扩展之一)具有local创建局部变量的关键字。它们只是默认为全局,而fish默认为本地。

同样,当您说“环境变量”时,您指的是“导出”变量,它要求在posixy shell中有一个显式的“导出”步骤,并且在fish中需要带有“ -x”或“ --export”标志set

我 这里有两个不同的作用-这个变量是否仅在此函数/块/任何地方可用,而不在外部可用,以及是否传递给子代(包括外部进程)。

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

非导出变量要一些。它们没有提供给操作系统setenv功能,因此不会将其复制到子进程中。

块结束时,将删除局部变量。实际上,将它们放在堆栈上并“弹出”顶部可以很好地完成此操作。

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

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

而且,您可以具有全局未导出的变量,这些变量可以由函数访问,但不能由外部命令访问。这些对于外壳程序设置(如$ fish_function_path,对外部工具无用)或$ COLUMN,很有用,如果导出,它们甚至可能损坏外部工具(因为它们开始读取它,而不是自己检查端子大小)。