免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10557 | 回复: 12
打印 上一主题 下一主题

shell中export的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-22 13:39 |只看该作者 |倒序浏览
本帖最后由 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=

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2011-04-22 13:49 |只看该作者
shell是顺序执行的
先执行 . ./test2.sh
然后是 AA=""
AA的值永远是空。

论坛徽章:
0
3 [报告]
发表于 2011-04-22 13:54 |只看该作者
回复 2# ly5066113


    不好意思,例子有点问题,已经该过来了

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 2011-04-22 14:00 |只看该作者
回复 3# whpu000625


怎么不是 . ./test2.sh 了?
如果不是在当前shell中运行,子shell中变量的改变是不会影响到父shell的。

论坛徽章:
0
5 [报告]
发表于 2011-04-22 14:18 |只看该作者
本帖最后由 whpu000625 于 2011-04-22 14:20 编辑

我的例子是先export一个变量AA,这样的话,这个环境变量在子shell中也应该是可见的,子shell中改变的是环境变量的值,
这样父进程为什么看不到环境变量的改变

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2011-04-22 14:41 |只看该作者
我的例子是先export一个变量AA,这样的话,这个环境变量在子shell中也应该是可见的,子shell中改变的是环境 ...
whpu000625 发表于 2011-04-22 14:18



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

怎会在test.sh 不知要用 . ./test2.sh

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2011-04-22 14:41 |只看该作者
回复 5# whpu000625


孩子不能影响爹。
试想一下,如果你export一个变量,可以被子shell改变,我同时并发2个、3个或更多的子shell
那么爹该听哪个儿子的呢?

论坛徽章:
0
8 [报告]
发表于 2011-04-22 15:04 |只看该作者
回复 6# jason680


    . ./test2.sh这样使用不能传递参数,我的程序中还要给其传递参数,所以只能./test2.sh了

论坛徽章:
0
9 [报告]
发表于 2011-04-22 15:05 |只看该作者
回复  whpu000625


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


明白了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 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交换位置
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP