Shell 里设置了变量,为什么启动的程序读不到?
【摘要】 启动脚本时,经常会先写一行 APP_MODE=demo,接着运行程序,结果程序却说这个变量不存在。原因通常是:当前 Shell 的普通变量和传给子进程的环境变量不是一回事。下面用 Bash 和一个子进程演示三种情况:unset APP_MODEAPP_MODE=demoprintf 'parent: %s\n' "$APP_MODE"bash -c 'printf "child before...
启动脚本时,经常会先写一行 APP_MODE=demo,接着运行程序,结果程序却说这个变量不存在。原因通常是:当前 Shell 的普通变量和传给子进程的环境变量不是一回事。
下面用 Bash 和一个子进程演示三种情况:
unset APP_MODE
APP_MODE=demo
printf 'parent: %s\n' "$APP_MODE"
bash -c 'printf "child before export: %s\n" "${APP_MODE:-unset}"'
APP_MODE=preview bash -c 'printf "child with prefix: %s\n" "$APP_MODE"'
printf 'parent after prefix: %s\n' "$APP_MODE"
export APP_MODE
bash -c 'printf "child after export: %s\n" "$APP_MODE"'
输出是:
parent: demo
child before export: unset
child with prefix: preview
parent after prefix: demo
child after export: demo
第一段只在当前 Shell 中赋值,子进程没有收到它。第二段把 preview 放进了这次启动的 bash 进程的环境,命令结束后,父 Shell 的值仍是 demo。第三段用 export 标记变量,之后由这个 Shell 启动的子进程就能继承该值。
这对调试很实用:只想给某一次命令传配置时,可以用 APP_MODE=preview 命令;希望当前终端随后启动的多个程序都使用同一个值时,可以先 export APP_MODE=demo。修改父 Shell 的变量后,已经启动的进程不会自动收到新值;要让程序重新读取,通常需要按程序支持的方式重载或重启。
排查时可以先在启动程序的同一个终端检查变量是否已导出,再核对服务实际由哪个环境启动。终端里设置的变量,不会自动进入另一个独立启动的服务进程。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)