Chinaunix

标题: shell中export的问题 [打印本页]

作者: whpu000625    时间: 2011-04-22 13:39
标题: shell中export的问题
本帖最后由 whpu000625 于 2011-04-22 13:58 编辑

我有如下三个文件
# cat test.sh
  1. #!/bin/bash

  2. #!/bin/bash
  3. AA=""
  4. export AA

  5. ./test2.sh

  6. echo "======test======="AA=$AA

复制代码
#cat test1.sh
  1. #!/bin/bash
  2. test()
  3. {
  4.    AA="aaaa"
  5. }
复制代码
#cat test2.sh
  1. #!/bin/sh
  2. . ./test1.sh
  3. test
  4. echo "=======test2======" AA=$AA
复制代码
test.sh中定义export出环境变量AA。
test1.sh中定义函数test用于改变AA的值,
test2.sh调用函数test。

在test2.sh中环境变量的值发生了改变,但是为什么在test.sh中看到的值没有改变


#./test.sh
=======test2====== AA=aaaa
======test=======AA=
作者: ly5066113    时间: 2011-04-22 13:49
shell是顺序执行的
先执行 . ./test2.sh
然后是 AA=""
AA的值永远是空。
作者: whpu000625    时间: 2011-04-22 13:54
回复 2# ly5066113


    不好意思,例子有点问题,已经该过来了
作者: ly5066113    时间: 2011-04-22 14:00
回复 3# whpu000625


怎么不是 . ./test2.sh 了?
如果不是在当前shell中运行,子shell中变量的改变是不会影响到父shell的。
作者: whpu000625    时间: 2011-04-22 14:18
本帖最后由 whpu000625 于 2011-04-22 14:20 编辑

我的例子是先export一个变量AA,这样的话,这个环境变量在子shell中也应该是可见的,子shell中改变的是环境变量的值,
这样父进程为什么看不到环境变量的改变
作者: jason680    时间: 2011-04-22 14:41
我的例子是先export一个变量AA,这样的话,这个环境变量在子shell中也应该是可见的,子shell中改变的是环境 ...
whpu000625 发表于 2011-04-22 14:18



在test2.sh 都知道要用 . ./test1.sh

怎会在test.sh 不知要用 . ./test2.sh
作者: ly5066113    时间: 2011-04-22 14:41
回复 5# whpu000625


孩子不能影响爹。
试想一下,如果你export一个变量,可以被子shell改变,我同时并发2个、3个或更多的子shell
那么爹该听哪个儿子的呢?
作者: whpu000625    时间: 2011-04-22 15:04
回复 6# jason680


    . ./test2.sh这样使用不能传递参数,我的程序中还要给其传递参数,所以只能./test2.sh了
作者: whpu000625    时间: 2011-04-22 15:05
回复  whpu000625


孩子不能影响爹。
试想一下,如果你export一个变量,可以被子shell改变,我同时并 ...
ly5066113 发表于 2011-04-22 14:41


明白了
作者: jason680    时间: 2011-04-22 15:33
回复  jason680


    . ./test2.sh这样使用不能传递参数,我的程序中还要给其传递参数,所以只能./tes ...
whpu000625 发表于 2011-04-22 15:04



$ cat t.sh
  1. #!/bin/bash
  2. echo ">>>[t.sh] start ..."
  3. AA=""
  4. export AA
  5. export qq="qqqq"
  6. echo "qq=$qq"
  7. echo "pg=$0,arg1=$1,arg2=$2,arg3=$3"
  8. . ./test2.sh $2 $1

  9. echo "======test======="AA=$AA
  10. echo "<<<[t.sh] end"
复制代码
$ cat test2.sh
  1. #!/bin/sh
  2. echo ">>>[test2.sh] start ..."
  3. echo "qq=$qq"
  4. echo "pg=$0,arg1=$1,arg2=$2,arg3=$3"
  5. . ./test1.sh
  6. test
  7. echo "=======test2======" AA=$AA
  8. echo "<<<[test2.sh] end"
复制代码
嗯,我这都没问题...除了$0外...
$ ./t.sh abc 123 xxx
>>>[t.sh] start ...
qq=qqqq
pg=./t.sh,arg1=abc,arg2=123,arg3=xxx
>>>[test2.sh] start ...
qq=qqqq
pg=./t.sh,arg1=123,arg2=abc,arg3=
=======test2====== AA=aaaa
<<<[test2.sh] end
======test=======AA=aaaa
<<<[t.sh] end
$
注:传给test2.sh参数1,2交换位置
作者: whpu000625    时间: 2011-04-22 17:24
$ cat t.sh$ cat test2.sh嗯,我这都没问题...除了$0外...
$ ./t.sh abc 123 xxx
>>>[t.sh] start . ...
jason680 发表于 2011-04-22 15:33



    恩,谢谢,使用bash执行是可以,但是使用sh执行不行,参数传递不进来。
作者: michaeltony    时间: 2011-04-22 19:47
微动嵌入式论坛有关于export的详细讲解,可以搜下看看
作者: xrzs1986    时间: 2011-04-23 18:04
回复 7# ly5066113


    这比喻太NB了,顶一个~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2