LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 843|回复: 5

EXPORT的困惑

[复制链接]
发表于 2005-6-19 19:22:23 | 显示全部楼层 |阅读模式
偶是新手,最近因为export的用法头疼
下面是我不理解的shell程序:

$ myname="Meng Qing"
$ export myname
$ cat example2
  myname="Liu Ying"
  echo "My name is $myname"
  example3
$ cat example3
  echo "My name is $myname"

然后我执行:
$ example2

结果是:
  My name is Liu Ying
  My name is Liu Ying

而执行 $ example3的结果是
My name is Meng Qing


请诸位大哥帮小弟解释解释,十分感激!
发表于 2005-6-20 02:13:50 | 显示全部楼层
Post by romeo198304
偶是新手,最近因为export的用法头疼
下面是我不理解的shell程序:

$ myname="Meng Qing"
$ export myname
$ cat example2
  myname="Liu Ying"
  echo "My name is $myname"
  example3
$ cat example3
  echo "My name is $myname"

然后我执行:
$ example2

结果是:
  My name is Liu Ying
  My name is Liu Ying

而执行 $ example3的结果是
My name is Meng Qing


请诸位大哥帮小弟解释解释,十分感激!


export将变量释放到当前shell的环境变量中,这样在子shell程序中,这个变量的值可直接带入。但是如果子shell中有一个相同的变量名赋值,子shell程序将优先使用那个值,而不是缺省的环境变量值。如你的example2程序,你在子shell里又给myname赋值,echo的当然是当前的值。而example3中子shell没有这个变量,那么它将从环境变量中读入值。同时,子shell中相同变量名的scope只局限在子shell中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-20 11:07:17 | 显示全部楼层
谢谢版主的回复!
我想再问一句:

既然example2是外层shell的子shell,在example2程序中example3又是example2的一个子shell,example2里面的变量没有用export导出的话对example3来说应该是不可见的,而为什么example3中的变量myname的值却是example2中的myname值呢?
回复 支持 反对

使用道具 举报

发表于 2005-6-20 12:28:50 | 显示全部楼层
Post by romeo198304
谢谢版主的回复!
我想再问一句:

既然example2是外层shell的子shell,在example2程序中example3又是example2的一个子shell,example2里面的变量没有用export导出的话对example3来说应该是不可见的,而为什么example3中的变量myname的值却是example2中的myname值呢?


啊哈,这个很有意思,你注意到了。其实原因很简单,因为myname这个变量是一个环境变量(你在当前shell时export了),这样所有的sub-shell对这个变量可见,同时可修改(注意你在example2时修改了)。。。
你可以这样试试,在当前shell时,不export这个变量。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-21 02:17:16 | 显示全部楼层
谢谢大哥的回复!
我不用export后
$ example2 的结果是:

My name is Liu Ying
My name is

而$ example3的结果是
My name is

但是我还是想问,按你说的用了export后当前shell的环境变量子shell可用也可修改的话为何
$ example3 的结果是
My name is  Meng Qing
而不是被修改过的 Liu Ying 呢?

我主要不懂的是为什么在example2脚本里面的example3的myname的值是example2里面定义的myname的值呢?

下面我将程序改成如下:

$ myname="Meng Qing"
$ export myname
$ cat example2
myname="Liu Ying"
echo "My name is $myname"
example3
$ cat example3
example4
$ cat example4
echo "My name is $myname"

然后我执行:
$ example2

结果仍然是:
My name is Liu Ying
My name is Liu Ying

而执行 $ example3和$ example4的结果都是
My name is Meng Qing

呵呵!头更晕了!忘各位大哥帮帮忙!
回复 支持 反对

使用道具 举报

发表于 2005-6-21 02:30:14 | 显示全部楼层
Post by romeo198304
谢谢大哥的回复!
我不用export后
$ example2 的结果是:

My name is Liu Ying
My name is

而$ example3的结果是
My name is

但是我还是想问,按你说的用了export后当前shell的环境变量子shell可用也可修改的话为何
$ example3 的结果是
My name is  Meng Qing
而不是被修改过的 Liu Ying 呢?

我主要不懂的是为什么在example2脚本里面的example3的myname的值是example2里面定义的myname的值呢?

下面我将程序改成如下:

$ myname="Meng Qing"
$ export myname
$ cat example2
myname="Liu Ying"
echo "My name is $myname"
example3
$ cat example3
example4
$ cat example4
echo "My name is $myname"

然后我执行:
$ example2

结果仍然是:
My name is Liu Ying
My name is Liu Ying

而执行 $ example3和$ example4的结果都是
My name is Meng Qing

呵呵!头更晕了!忘各位大哥帮帮忙!


不管有多少脚本会在你得第一个脚本里执行,所有的子shell都可见那个变量。还有就是scope,这个很重要,脚本中的变量的永远是在子shell中,除非你. ./script运行它或是source它,不然回到当前shell,他仍然是原来的值。在code实现上,我认为是在子shell中取了环境变量的copy.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表