我已经在使用鱼壳了一段时间,最近我与同事就局部变量进行了交谈。显然,Bash不支持局部变量,仅使用环境变量在进程之间传递动态数据。局部变量是否也只是环境变量,但还有一些额外的内容?我对鱼如何造成这种行为感到好奇。
答案 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)
这里似乎存在一些误解:
export
(bash)和set -x
(fish)命令的原因。