我使用带有本机 Bash 的 Ubuntu 16.04。
我不确定是否执行
#!/bin/bash
myFunc() {
export myVar="myVal"
}
myFunc
在任何意义上都等于执行export myVar="myVal"
.
当然,全局变量通常应该在函数之外声明(我假设这是一个约定问题,即使在技术上是可能的)但我确实想知道更奇特的情况,即编写一些非常通用的函数并希望在其中的变量仍然可以在任何地方使用。
函数export
内部的变量是否等同于直接在 CLI 中全局导出它,使其可用于 shell 中的所有内容(所有子 shell 以及其中的函数)?
您的脚本在脚本的环境中创建了一个环境变量
myVar
。目前呈现的脚本在功能上完全等同于函数体中发生的事实
export
与环境变量的范围无关(在这种情况下)。一旦调用该函数,它将开始存在。该变量将在脚本环境和函数调用后从脚本启动的任何其他进程的环境中可用。
该变量不会存在于父进程的环境(您从中运行脚本的交互式 shell)中,除非脚本是来源(使用
.
orsource
),在这种情况下,整个脚本将在交互式 shell 的环境中执行(即“采购”外壳文件的目的)。没有函数调用本身:
获取此文件将放置
myFunc
在调用 shell 的环境中。然后调用该函数将创建环境变量。另请参阅问题shell 变量可以具有哪些范围?
如果使用导出变量的函数,请确保不要在子 shell 中调用它,例如
如果管道函数也会发生这种情况,因为管道使用子外壳。
例如管道进入三通:
要避免使用管道子外壳,请改用重定向: