Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315307
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类:

2010-08-04 14:07:22

突然想到一个类比, 可以让对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  的间接层, 达到了这一目的.
阅读(1284) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~