Shell脚本三类变量的官方术语及本质差异咨询
Bash Shell变量的官方术语与区分标准
一、官方术语及核心区分维度
Bash官方文档中,变量主要从作用域和是否传递给子进程两个维度分类,对应你提到的三类场景,官方术语和区分标准如下:
1. 环境变量(Environment Variables)
- 对应你定义的「全局环境变量」
- 定义方式:通过
export 变量名=值声明,或先定义变量再用export 变量名导出 - 核心特征:会被传递给当前Shell的所有子进程(包括子Shell),当前Shell、脚本全局、子Shell/子进程均能访问;可通过
printenv或env命令查看。
2. 全局Shell变量(Global Shell Variables)
- 对应你定义的「全局变量」
- 定义方式:在脚本顶层(函数外部)直接赋值,未执行
export操作 - 核心特征:作用域仅限于当前Shell会话/脚本全局,不会自动传递给子Shell;仅能通过
set命令查看(set会列出所有Shell变量,包括环境变量)。
3. 局部Shell变量(Local Shell Variables)
- 对应你定义的「局部变量」
- 定义方式:在函数内部通过
local 变量名=值声明 - 核心特征:作用域严格限制在定义它的函数及其内部嵌套函数(未被重新定义的情况下),函数外部无法访问;同样仅能通过
set命令查看(仅在函数执行时存在)。
关于术语混用的说明:部分人将「未导出的变量」统称为局部变量,这是混淆了传递性和作用域两个维度。官方的核心区分逻辑是:
- 按传递性:环境变量(可传递给子进程) vs 非环境变量(不可传递)
- 按作用域:全局(脚本/Shell顶层) vs 局部(函数内部)
二、示例中var1与var2的底层区别
先明确示例的执行逻辑:source ./vartest.sh是在当前Shell会话中直接执行脚本代码,而非启动子Shell。从输出看两者行为一致,但底层存在以下区别:
1. 创建上下文不同
var1是在脚本执行前,由你在交互式Shell中手动定义的全局Shell变量(若你未执行export var1,则它是非环境变量;若执行过export,则同时是环境变量)。var2是脚本执行时,在当前Shell中新增的全局Shell变量(默认是非环境变量,除非脚本中添加export var2)。
2. 变量属性可能不同
- 若
var1被导出过,它会出现在printenv的输出中,而var2默认不会;此时var1具备「环境变量」属性,可被后续启动的子Shell继承,var2则不行。 - 从Bash内部存储来看,环境变量会被存入专门的环境变量表(传递给子进程时会复制该表),而非环境变量的全局Shell变量仅存在于当前Shell的内部变量表中,不会被子进程继承。
3. 生命周期的初始节点不同
var1的生命周期始于你手动定义它的时刻,而var2的生命周期始于脚本执行到var2="global_var2"这一行的时刻,两者均会持续到当前Shell会话结束(除非被unset命令删除)。
内容的提问来源于stack exchange,提问作者myoldgrandpa
相关产品推荐
相关产品推荐

