Bash设置全局变量后局部变量消失问题求助
问题根源与解决办法
你搞错了Bash里
set命令的用法:Windows里set是用来定义变量的,但Bash完全不一样——set默认是用来配置shell选项或者设置位置参数的,根本不是定义普通变量的命令。- 你执行
set MY_VAR=42时,并没有创建名为MY_VAR的shell变量,只是把MY_VAR=42这个字符串设成了位置参数$1,同时特殊变量_(记录上一条命令的最后一个参数)会存这个值,这就是第一次set | grep MY_VAR能看到输出的原因。但这时候你执行echo $MY_VAR其实已经是空的,只是你没注意。 - 当你跑
export MY_GLOBAL_VAR="fun with vars"后,_变量会被更新成这条命令的最后一个参数,之前的_=MY_VAR=42自然就没了;而你以为存在的MY_VAR从始至终都没被定义成真正的shell变量,所以echo $MY_VAR当然没输出。
- 你执行
正确的变量定义方式:
- 定义仅当前shell可用的普通变量:直接写
MY_VAR=42(注意等号前后不能加空格)。 - 定义子进程也能继承的全局变量:要么
export MY_GLOBAL_VAR="fun with vars",要么先定义再导出:MY_GLOBAL_VAR="fun with vars"; export MY_GLOBAL_VAR。
- 定义仅当前shell可用的普通变量:直接写
验证效果:
按正确方式操作后,echo $MY_VAR会输出42,set | grep MY_能同时看到MY_VAR=42和MY_GLOBAL_VAR='fun with vars',再也不会出现变量“消失”的情况。
内容的提问来源于stack exchange,提问作者Fox
相关产品推荐
相关产品推荐

