变量需用 export 显式导出才能被子进程继承,未导出的变量仅限当前 shell;export 必须在调用子脚本前执行,且只影响后续新建子进程。

要用变量在子进程中生效,必须用 export 显式导出,否则子进程根本看不到它。
必须 export 才能传给子进程
Shell 中定义的变量默认是本地变量,只在当前 shell 进程中有效。子进程(比如你用 ./script.sh 启动的脚本)是全新 fork 出来的独立进程,不会自动继承未导出的变量。
- 写法示例:
FILM="A Few Good Men"; export FILM或简写为export FILM="A Few Good Men" - 导出后,所有后续启动的子进程(包括其他脚本、命令、程序)都能通过
$FILM读取该值 - 未 export 的变量,即使在父脚本里 echo 能看到,子脚本里
echo $FILM也会输出空
导出时机很重要:要在调用子脚本前完成
export 必须发生在执行子脚本命令之前,顺序不能颠倒。
- ✅ 正确:
export PATH="/my/bin:$PATH"; ./myscript.sh - ❌ 错误:
./myscript.sh; export PATH="/my/bin:$PATH"—— 子脚本已运行完,导出没意义 - 注意:export 不影响已经运行中的子进程,只对之后新创建的生效
验证是否导出成功
可以用 env | grep 变量名 或 printenv 变量名 检查当前环境里是否存在该变量。
-
export MYVAR=123之后运行printenv MYVAR应输出123 - 如果输出为空,说明没导出或拼写错误
- 子脚本中也可以加
echo "MYVAR=$MYVAR"直接观察是否收到
常见误区提醒
有些操作看似“传递”,其实机制完全不同:
-
source ./script.sh或. ./script.sh是在当前 shell 执行,不产生子进程,所以无需 export,变量天然共享 -
exec ./script.sh是替换当前进程,原有变量仍保留(只要之前 export 过),但原脚本后续语句不再执行 - 子脚本里改
export MYVAR=newvalue,不会反向影响父脚本 —— 环境变量单向继承,不可回传


















