You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同Bash脚本共享变量时后台子进程的变量值是否会被冻结?

结论与原理说明

你猜想的行为完全正确,这是符合POSIX标准的通用预期行为,不受发行版、Shell版本差异影响。

核心原理

  • Bash中任意以&结尾的命令,都会被分配到独立的子shell进程中运行,哪怕命令是source也不例外(正常source是在当前进程执行代码,但搭配&时会先fork子shell,再在子shell中执行source操作)。
  • 子进程的环境变量会在fork创建的瞬间,从父进程的环境变量完整拷贝一份,拷贝完成后父子进程的环境空间完全隔离,后续任意一方修改自身环境变量都不会影响另一方。

对应你的代码场景表现

  1. 第一次启动source script2.sh &时,父进程的THING值是a,对应子shell里拷贝到的THING值固定为a,后续父进程修改THING为b,也不会修改这个子进程内部的变量值,所以5秒后输出的PRINT2仍然是a。
  2. 第二次启动source script2.sh &时,父进程的THING已经修改为b,对应新建的子shell拷贝到的THING值就是b,输出的两个打印值都会是b。

典型运行输出如下:

PRINT1: a
PRINT1: b
PRINT2: a
PRINT2: b

补充说明:如果去掉&直接执行source script2.sh,那么脚本会在父进程当前环境运行,后续父进程修改变量会影响脚本执行时的取值,和后台运行的逻辑完全不同。

内容的提问来源于stack exchange,提问作者Limone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:54:03