shell变量不自动跨脚本共享,需通过export导出供子进程继承、source合并执行实现同进程共享,或用临时文件中转;仅赋值不export、子脚本内export、并行脚本间均无法共享。

Shell变量本身不自动跨脚本共享,但可以通过几种明确、可控的方式让一个脚本把值“传递”给另一个脚本。关键不是“全局变量”,而是主动导出、读取或注入。
用环境变量 + export 实现父子进程传递
子脚本能直接继承父脚本(或当前 Shell)中 已 export 的变量,这是最常用也最可靠的方式。
- 在调用前设置并导出: export USER_NAME="alice"export CONFIG_PATH="/etc/myapp.conf"
- 被调用的脚本(如
sub.sh)里可直接使用:echo "运行用户:$USER_NAME"cat "$CONFIG_PATH" - 注意:仅对 子进程有效(比如用
./sub.sh或bash sub.sh启动),不能反向影响父 Shell 或并行脚本
用 source(或 .)让脚本“合并执行”
如果两个脚本逻辑紧密,可让主脚本 source 另一个脚本,这时所有变量都在同一 Shell 环境中,自然共享。
- 例如
main.sh中写:MY_VERSION="2.1"source ./config.sh# config.sh 里能直接读 MY_VERSIONecho "最终版本:$APP_VERSION" - 反过来,
config.sh也可以定义变量供main.sh使用 - 本质是“同一个进程内执行”,没有进程隔离,所以变量完全可见
用文件临时中转参数
当无法控制执行顺序或需跨会话/跨用户时,可把变量值写入临时文件,再由另一脚本读取。
- 脚本 A 写入:
echo "db_host=localhost" > /tmp/script_params.envecho "db_port=5432" >> /tmp/script_params.env - 脚本 B 读取并加载:
set -o allexportsource /tmp/script_params.envset +o allexport
(allexport让 source 进来的变量自动导出) - 适合定时任务、systemd 服务或权限受限场景,但要注意文件权限和清理
避免常见误区
这些做法不会真正共享变量:
- 只写
VAR=value不加export→ 子脚本看不到 - 在子脚本里
export VAR→ 只影响它自己的子进程,父脚本不变 - 期望两个并行执行的
./a.sh和./b.sh自动共享变量 → 它们是独立进程,内存隔离 - 用
bash script.sh启动 → 新建子 Shell,变量不会回传到当前终端











