我使用带有本机 Bash 的 Ubuntu 16.04。
我不确定是否执行
#!/bin/bash
myFunc() {
export myVar="myVal"
}
myFunc
在任何意义上都等于执行export myVar="myVal"
.
当然,全局变量通常应该在函数外部声明(我认为这是一个约定问题,即使技术上可行),但我确实想知道更奇特的情况,即人们编写一些非常通用的函数并希望在其中使用一个变量仍然可以在任何地方使用任何东西。
export
函数内部的变量是否与直接在 CLI 中全局导出它相同,使其可用于 shell 中的所有内容(所有子 shell 以及其中的函数)?
答案1
myVar
您的脚本在脚本的环境中创建一个环境变量。目前所提供的脚本在功能上完全等同于
#!/bin/bash
export myVar="myVal"
事实上,export
发生在函数体中的事实与环境变量的范围无关(在本例中)。一旦调用该函数,它就会开始存在。
该变量将在脚本环境以及函数调用后从脚本启动的任何其他进程的环境中可用。
该变量不会存在于父进程的环境(运行脚本的交互式 shell)中,除非脚本是源自(使用.
或source
),在这种情况下,整个脚本将在交互式 shell 的环境(即“采购”shell 文件的目的)。
没有函数调用本身:
myFunc() {
export myVar="myVal"
}
采购这文件将放置myFunc
在调用 shell 的环境中。然后调用该函数将创建环境变量。
另请参阅问题shell 变量可以有哪些作用域?
答案2
如果使用导出变量的函数,请确保不要在子 shell 中调用它,例如
( export_var_func ) # Variable will NOT be exported outside
如果通过管道传输函数也会发生这种情况,因为管道使用子外壳。
例如管道进入三通:
export_var_func | tee my.log # Variable will NOT be exported outside
要避免使用管道子 shell,请改用重定向:
export_var_func > >(tee func.log) # Variable WILL be exported outside