environment-variables - 局部变量实现
问题描述
我一直在使用鱼壳,最近我与一位同事就局部变量进行了交谈。显然,Bash 不支持局部变量,只使用环境变量在进程之间传递动态数据。局部变量是否也只是环境变量,但还有一些额外的东西?我很好奇鱼是如何产生这种行为的。
解决方案
Bash 不支持局部变量
这不是真的。Bash(和其他 shell,包括 dash - 它是它拥有的少数 POSIX 扩展之一)具有local
创建局部变量的关键字。它们只是默认为全局,而鱼默认为本地。
此外,当您说“环境变量”时,您的意思是“导出”变量,这需要在 posixy shell 中明确的“导出”步骤,以及在 fish 中的“-x”或“--export”标志set
。
IE。这里有两个不同的事情在起作用——这个变量是否只在这个函数/块/任何东西中可用,而不是在外部,以及它是否传递给children,包括外部进程。
局部变量是否也只是环境变量,但还有一些额外的东西?
非导出变量少一些。它们没有被赋予操作系统的setenv
功能,因此它不会将它们复制到子进程。
当块结束时,局部变量被删除。在实践中,这可以通过将它们放在堆栈上并“弹出”顶部来很好地完成。
请注意,至少在鱼类中,这些概念是完全正交的:
您可以拥有本地导出的变量(带有set -lx
),它们将被传递给外部命令并复制到函数(因此它们获得自己的本地版本),但在函数结束时被删除。这些对于临时更改某些内容很有用——例如,仅为函数设置 $PATH,或在调用某些内容时覆盖 $EDITOR。
并且您可以拥有全局未导出的变量,这些变量可以通过函数访问,但不能通过外部命令访问。这些对于像 $fish_function_path 这样的 shell 设置很有用,它对外部工具没有用,或者 $COLUMN,如果导出它甚至可能会破坏外部工具(因为它们开始读取它而不是自己检查终端大小)。
推荐阅读
- javascript - formData 允许 e.target, e.currentTarget 但不允许 'this'... 为什么?
- django - 如何过滤模型 Django 并与 id 进行比较
- sql - 为什么包含聚合的 SQL SELECT 不能访问其他列?
- python - python数据上的蒙特卡洛拟合
- webpack - 如何在 next-js 的 css-modules 中默认`:global`?
- amazon-web-services - 如何为 VPN 上的 Private Route 53 托管区域获取有效的 SSL 证书
- apache-kafka - 没有输入主题的拓扑将不会创建流线程和全局线程
- c# - 服务器响应中的 DateTime.UtcNow 显示比响应后客户端调用的 DateTime.UtcNow 更晚的时间
- git - 使用本地 Git LFS 存储库检查是否有任何文件更改而无需在 .git 下复制
- python - 多个用户输入和他们的第二个输入