BASH函数内外执行source脚本时export的行为差异问题
为什么bash函数内外执行
VAR=value source的行为不一样? 这个差异的核心原因是bash对普通变量和环境变量的处理逻辑不同,结合函数内变量的作用域特性导致的:
函数外的行为解析
- 初始状态:
SOME_VARIABLE="good value"是一个未被export的普通全局变量,不属于shell的环境变量集合。 - 执行
SOME_VARIABLE='' source ./someOtherScript.bash时,bash会临时将SOME_VARIABLE设为空,并将其加入当前shell的环境变量集合(仅在source执行期间生效)。 source执行someOtherScript.bash中的export SOME_VARIABLE='SOME OTHER VALUE',只会修改临时加入的环境变量值,不会改变原本的普通全局变量。source执行完毕后,bash会移除这个临时添加的环境变量,原本的普通全局变量SOME_VARIABLE="good value"依然保留,所以最终输出还是原始值。
函数内的行为解析
- 进入函数
foo后,SOME_VARIABLE依然是未被export的普通全局变量(函数内未用local声明,默认全局)。 - 执行
SOME_VARIABLE='' source ./someOtherScript.bash时,同样临时设置SOME_VARIABLE为空并加入环境变量集合。 source执行export SOME_VARIABLE='SOME OTHER VALUE'时,会将全局的SOME_VARIABLE标记为环境变量,同时修改其值为'SOME OTHER VALUE'。source执行完毕后,bash不会恢复这个变量的值——因为它已经从普通变量升级为环境变量,不再是临时添加的变量,所以全局的SOME_VARIABLE值被永久修改。
验证与延伸
- 如果在函数外先执行
export SOME_VARIABLE="good value",再执行SOME_VARIABLE='' source ./someOtherScript.bash,最终输出会和函数内一致,变成'SOME OTHER VALUE'——因为此时变量本身就是环境变量,bash不会恢复其原始值。 - 如果在函数内用
local SOME_VARIABLE声明变量,那么source的修改只会作用于函数内的局部变量,不会影响全局变量。
内容的提问来源于stack exchange,提问作者stonea
相关产品推荐
相关产品推荐

