bash中的普通变量与环境变量
时间:2010-08-04 来源:slimzhao
突然想到一个类比, 可以让对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 的间接层, 达到了这一目的.
把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 的间接层, 达到了这一目的.
相关阅读 更多 +