linux中shell变量要在子进程中继承,关键在于用export导出:普通变量(如tmp=123)仅限当前shell,子进程不可见;只有export var=value或先赋值再export的变量才成为环境变量,被子进程继承,可通过env或bash -c 'echo $var'验证。

Linux中Shell变量要在子进程中继承,关键在于区分局部变量和环境变量:只有用export导出的变量才会传给子进程,普通赋值的变量不会。
哪些变量能被子进程继承
只有标记为“环境变量”的变量才会被子进程继承。判断方式很简单:
- 用
export VAR=value定义,或先VAR=value再export VAR - 变量名出现在
env或printenv输出列表中 - 未导出的变量(如
tmp=123)在bash -c 'echo $tmp'里为空
常见子进程场景与验证方法
不同启动方式对变量继承的影响很实际,注意以下几种典型情况:
-
bash或sh启动交互子shell:继承所有已export的变量 -
./script.sh执行脚本:等同于新建子进程,只继承export变量 -
source script.sh或. script.sh:不产生子进程,在当前shell执行,所有变量(含未导出)都可见 -
exec ./script.sh:替换当前进程,环境变量保留,但原shell会退出
为什么子进程改了变量,父进程看不到
这是进程隔离的基本机制:环境变量从父进程拷贝一份给子进程,双方内存独立。
- 子进程修改
exported_var,只影响自己那份副本 - 父进程中的同名变量保持原值,不受任何影响
- 没有机制让子进程把变量“回传”给父进程
调试与确认技巧
快速验证变量是否成功继承,可以这样操作:
- 在父shell中设变量并导出:
MYDATA="test"; export MYDATA - 进子shell检查:
bash -c 'echo "in child: $MYDATA"'→ 应输出test - 对比未导出变量:
NOEXPORT="hidden"; bash -c 'echo "noexport: $NOEXPORT"'→ 输出为空 - 查看全部环境变量:
env | grep MYDATA确认存在











