为何子Shell p3能读取父Shell p2未导出的TVAR变量?
问题分析与解答
脚本代码
p1.sh
#!/bin/bash TVAR=ISP1; export TVAR p2.sh
p2.sh
#!/bin/bash TVAR=ISP2 p3.sh
p3.sh
#!/bin/bash echo $TVAR
核心原因
执行链路是p1.sh启动子进程运行p2.sh,p2.sh再启动子进程运行p3.sh,关键在于环境变量的导出状态具有持续性:
p1中通过export把TVAR标记为环境变量,p2作为子进程继承了这个已导出的变量(初始值ISP1)。p2里的TVAR=ISP2是修改这个已处于导出状态的变量的值,而非新建普通变量。变量一旦被标记为环境变量,后续修改值无需再次执行export,它依然保持环境变量属性。p3作为p2的子进程,会继承p2中已更新的环境变量TVAR=ISP2,因此最终输出ISP2。
你看到的“子Shell会继承父Shell的环境,环境包含父Shell导出的内容”这句话完全正确,这里的误区是误以为修改已导出的变量需要重新导出,实际上不需要——只要变量曾经被导出过,后续的赋值操作会自动同步到环境中,子进程就能拿到新值。
内容的提问来源于stack exchange,提问作者kldd
相关产品推荐
相关产品推荐

