突然想到一个类比, 可以让对bash中的普通变量与环境变量的关系有一个清晰的区分:
把bash 看作是编程语言.
则bash的普通变量, 就相当于C语言中的普通变量, 如全局变量, 自动变量
而bash中的环境变量, 也正如C语言中使用的环境变量.
但bash的
A=asdf
export A
可以容易地使作为bash脚本语言的变量晋级为环境变量. 也许正是这一点加剧了人们容易混淆这两种类型的变量, 从技术上说, 它们相当不同.
但, 如果产生一个子shell, 为什么可以读取父进程中同样的普通变量呢? 这个跟unix类操作系统的fork 实现有关, fork一个子进程时, 几乎是父进程的完全克隆. 正如你在C语言中, 调用fork后新产生的子进程, 同样有一份跟父进程一样的变量副本.
总之, bash中普通变量属于脚本语言的设计决定, 而环境变量则是进程执行环境定义的一部分.
等等, 你说产生子shell时, 因为fork的原因, 子shell才拥有了父进程中同样的普通变量, 那么windows上通过cygwin执行的bash呢, 呃, 真问住我了, 毕竟不同操作系统上父子进程之间的关系相当不同, unix中的fork几乎复制一切, 而windows的父子进程则复制的很少, 我真不知道, cygwin中的bash究竟使用了什么魔法, 也许是通过cygwin1.dll 的间接层, 达到了这一目的.
阅读(526) | 评论(0) | 转发(0) |