C程序设置的环境变量无法被Bash脚本读取的技术问题
问题:为何Bash脚本无法读取C程序设置的环境变量$VERSION?
C程序(文件名:temp.c)
main () { putenv ("VERSION"); setenv ("VERTSION","1.0",1); printf ("%s\n\r",getenv ("VERSION"); exit (0); }
C程序输出: 1.0
Bash脚本
./temp echo "Ver from bash:"$VERSION
Bash脚本输出:
1.0 **(from c program)** Ver from bash: **(from bash shell, why wont $VERSION get output here?)**
这问题的核心是进程环境变量的继承规则——子进程能继承父进程的环境变量,但子进程对环境变量的修改完全不会反向影响父进程,甚至连兄弟进程都看不到。
咱们拆解一下你的执行流程:
- 你的Bash脚本是当前shell的子进程,它本身继承了当前shell的环境变量。
- 当脚本里运行
./temp时,Bash又会创建一个新的子进程来执行这个C程序。这个C进程会复制脚本进程的环境变量,然后在自己的独立进程空间里修改环境变量——你用setenv设置的VERSION(哦对了,你代码里打错成VERTSION了,应该是笔误)只存在于这个C进程的内存里。 - 当C程序运行结束退出后,系统会回收这个子进程的所有资源,包括它修改的环境变量。脚本进程(也就是父进程)根本感知不到这些修改,所以后续的
echo自然拿不到$VERSION的值。
如果想让Bash脚本获取到C程序要设置的变量,得换个思路:让C程序输出变量的赋值语句,然后让Bash直接执行这个语句。比如修改C程序,让它打印export VERSION=1.0,然后在脚本里这么写:
eval $(./temp) echo "Ver from bash:"$VERSION
这样eval会把C程序的输出当作Bash命令执行,就能把VERSION导入到脚本的环境里了。
另外提个小细节:你的C程序代码有两个小bug,一个是setenv里的变量名写错成VERTSION了,另一个是printf的括号没闭合,虽然输出是对的,但实际编译会报错哦~
内容的提问来源于stack exchange,提问作者Shreyas Hemachandran
相关产品推荐
相关产品推荐

