局部变量实现

时间:2019-07-11 10:06:01

标签: environment-variables fish

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

2 个答案:

答案 0 :(得分:5)

  

Bash不支持局部变量

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

另外,当您说“环境变量”时,您指的是“导出”变量,它们需要在posixy shell中进行显式的“导出”步骤,并且将{-{1}的“ -x”或“ --export”标志}。

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

  

局部变量是否也只是环境变量,但还有其他功能吗?

非导出变量是 less 。它们没有提供给操作系统的set函数,因此不会将它们复制到子进程中。

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

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

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

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

答案 1 :(得分:2)

这里似乎存在一些误解:

  • bash可以具有函数局部变量:https://www.gnu.org/software/bash/manual/bash.html#index-local
  • 并非每个sh​​ell(bash / fish / etc)变量都在环境中。这就是存在export(bash)和set -x(fish)命令的原因。
  • 要使两个独立的进程共享相同的变量值,必须将它们通过环境传递。环境是将Shell变量公开给其他进程的方式。