免费注册 查看新帖 |

Chinaunix

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

为什么不export变量,子shell就可以访问呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-21 09:02 |只看该作者 |倒序浏览
本帖最后由 黑色阳光_cu 于 2010-10-21 09:05 编辑
  1. DAEMON_NAME="GND"
  2. BIN_PATH="/opt/gnd"
  3. DAEMON="gnd_daemon_linux"
  4. ARGV=""
  5. LOCK_FILE="/var/lock/$DAEMON.pid"
  6. LOG_FILE="/var/log/$DAEMON.log"
  7. errno=0
  8. pid=""

  9. start () {
  10.     getpid
  11.     if proc_status $pid
  12.     then
  13.         errno=1
  14.         echo "$DAEMON_NAME already running ..."
  15.     else
  16.         echo -n "Starting $DAEMON_NAME ... "
  17.         (
  18.             if [ -e "$LOG_FILE" ]
  19.             then
  20.                 mv -f $LOG_FILE $LOG_FILE.old
  21.             fi

  22.             exec 8>$LOG_FILE
  23.             exec 0</dev/null
  24.             exec 1>&8
  25.             exec 2>&8

  26.             cd $BIN_PATH && exec ./$DAEMON $ARGV
  27.         ) &
复制代码
为什么在( ) & 之间,可以访问到那几个变量?

论坛徽章:
0
2 [报告]
发表于 2010-10-21 09:17 |只看该作者
本帖最后由 where27 于 2010-10-21 09:22 编辑

都知道是子shell了,儿子当然有老爸的遗传啦
反过来才不行

论坛徽章:
0
3 [报告]
发表于 2010-10-21 09:31 |只看该作者
都知道是子shell了,儿子当然有老爸的遗传啦
反过来才不行
where27 发表于 2010-10-21 09:17



在shell下直接运行一个shell脚本,为什么不行呢?

VAR=123
./test.sh

cat test.sh
#!/bin/bash

echo $VAR

论坛徽章:
0
4 [报告]
发表于 2010-10-21 10:46 |只看该作者
回复 3# 黑色阳光_cu


    确实,有点想当然了,好像在()里运行的子shell,能继承父进程的本地变量和环境变量,而使用shell脚本产生的子shell,只能继承环境变量,我也不懂了,等高手解答。。

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
5 [报告]
发表于 2010-10-21 10:46 |只看该作者
同样的都是儿子,只是楼主说的( ... ),被执行的时候,已经将括号里面的变量赋值了而已。

bash>var=123
bash>(echo $var)

上面执行(echo $var)其实是执行(echo 123)

论坛徽章:
0
6 [报告]
发表于 2010-10-21 10:48 |只看该作者
同样的都是儿子,只是楼主说的( ... ),被执行的时候,已经将括号里面的变量赋值了而已。

bash>var=123
...
nxlinux 发表于 2010-10-21 10:46



    已经将括号里面的变量赋值了?为什么会这样呢?

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
7 [报告]
发表于 2010-10-21 11:02 |只看该作者
var=123
set -x
(echo $var)
--------------------------
+ echo 123
123
--------------------------

在执行(echo $var)的时候,其实已经把$var解析了,,执行的其实是echo 123

论坛徽章:
0
8 [报告]
发表于 2010-10-21 12:08 |只看该作者
var=123
set -x
(echo $var)
--------------------------
+ echo 123
123
------------------------- ...
nxlinux 发表于 2010-10-21 11:02



不对

  1. #!/bin/bash

  2. VAR=123
  3. (
  4.     echo $VAR
  5.     VAR=456
  6.     echo $VAR
  7. ) &

  8. wait
复制代码
按你所说,那应该都打印123才吧,实际上不是

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
9 [报告]
发表于 2010-10-21 14:16 |只看该作者

  1. #!/bin/bash

  2. VAR=123
  3. (
  4.      echo $VAR
  5.      VAR=456
  6.      echo $VAR
  7. ) &
  8. echo $VAR
复制代码
你的VAR被赋值为456后,怎么还能输出123呢?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
10 [报告]
发表于 2010-10-21 17:04 |只看该作者
本帖最后由 waker 于 2010-10-21 17:06 编辑

你定义一个变量,一般放在进程的堆栈X里,如果你export了,它就放在命令行参数与环境变量区域O里,

一个进程产生子进程就是完全复制(fork)一份自己,那么子进程里就有一份和父进程一模一样的变量,不论它在X里还是在O里,这就是你1楼的现象,子进程能“访问”到父里程的变量,其实是子进程访问了变量的一个副本,它本来就是子进程的,只不过和父进程里那一个一模样而已,你当然也可以改变它或消除它,这就是你8楼的现象。

如果子进程后来加载(exec)了一个新的程序,那么X区域就被清理了,副本就不在了,这就是3楼的现象。如果你不想一个变量被exec清理,那你就export一下把副本留在O区域
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP