不同Bash脚本共享变量时后台子进程的变量值是否会被冻结?
结论与原理说明
你猜想的行为完全正确,这是符合POSIX标准的通用预期行为,不受发行版、Shell版本差异影响。
核心原理
- Bash中任意以
&结尾的命令,都会被分配到独立的子shell进程中运行,哪怕命令是source也不例外(正常source是在当前进程执行代码,但搭配&时会先fork子shell,再在子shell中执行source操作)。 - 子进程的环境变量会在fork创建的瞬间,从父进程的环境变量完整拷贝一份,拷贝完成后父子进程的环境空间完全隔离,后续任意一方修改自身环境变量都不会影响另一方。
对应你的代码场景表现
- 第一次启动
source script2.sh &时,父进程的THING值是a,对应子shell里拷贝到的THING值固定为a,后续父进程修改THING为b,也不会修改这个子进程内部的变量值,所以5秒后输出的PRINT2仍然是a。 - 第二次启动
source script2.sh &时,父进程的THING已经修改为b,对应新建的子shell拷贝到的THING值就是b,输出的两个打印值都会是b。
典型运行输出如下:
PRINT1: a PRINT1: b PRINT2: a PRINT2: b
补充说明:如果去掉
&直接执行source script2.sh,那么脚本会在父进程当前环境运行,后续父进程修改变量会影响脚本执行时的取值,和后台运行的逻辑完全不同。
内容的提问来源于stack exchange,提问作者Limone
相关产品推荐
相关产品推荐

