免费注册 查看新帖 |

Chinaunix

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

一个subshell的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-15 11:56 |只看该作者 |倒序浏览
[jldev@jlstat tmp]$ cat a.sh
echo a=$a
echo set $(set|wc -l)
echo env $(env|wc -l)
echo $SHELLOPTS
[jldev@jlstat tmp]$ ./a.sh
a=
set 58
env 41
braceexpand:hashall:interactive-comments
[jldev@jlstat tmp]$ a=3
[jldev@jlstat tmp]$ ./a.sh
a=
set 58
env 41
braceexpand:hashall:interactive-comments
[jldev@jlstat tmp]$ (echo $a)
3

./a.sh和(echo $a)
不都是subshell吗,为什么./a.sh打印不出来a=3

论坛徽章:
0
2 [报告]
发表于 2004-04-15 12:10 |只看该作者

一个subshell的问题

try this:

  1. export a=3
  2. ./a.sh
复制代码

论坛徽章:
0
3 [报告]
发表于 2004-04-15 13:31 |只看该作者

一个subshell的问题

thx.i see
我想知道的是
[jldev@jlstat tmp]$ a=3
[jldev@jlstat tmp]$ cat a.sh
echo a=$a
[jldev@jlstat tmp]$ ./a.sh
a=
[jldev@jlstat tmp]$ (echo $a)
a=3

都是执行子shell,为什么会有差别

论坛徽章:
0
4 [报告]
发表于 2004-04-15 13:38 |只看该作者

一个subshell的问题

faint, 既然你现在已经知道
export a=3
./a.sh

a=3
./a.sh
有区别,为什么不去看看 export 是怎么回事呢?!这自己一查 man bash 里 export 这一节就清楚了。

再说这种问题你也不是第一个提的了,应该先在论坛里搜索一下,看看别人是怎么说的。

论坛徽章:
0
5 [报告]
发表于 2004-04-15 14:37 |只看该作者

一个subshell的问题

可能是我的表达有问题,你产生了误解。
我想问的是:
[jldev@jlstat tmp]$ ( echo $a; env|grep -q ^a= && echo  a  in env || echo a not in env ; set|grep -q ^a= && echo a  in set || echo a not in set )
输出是:
3
a not in env
a not in set
但是如果
[jldev@jlstat tmp]$ echo ' echo $a; env|grep -q ^a= && echo  a  in env || echo a not in env ; set|grep -q ^a= && echo a  in set || echo a not in set ' > /tmp/b.sh ; chmod u+x /tmp/b.sh ; /tmp/b.sh
输出是:

a not in env
a not in set
为什么这两个命令执行有差异。而不是为什么export可以把值传到子shell中
我想知道shell在执行上述两条命令时是如果构造各种变量的

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
6 [报告]
发表于 2004-04-15 14:47 |只看该作者

一个subshell的问题

主要是要理解bash在何时对变量进行扩展,这个疑问就迎刃而解了。
(cmd1;cmd2...bash会在subshell启动之前已经进行预处理了,并且subshel不再进一步解析。l

论坛徽章:
0
7 [报告]
发表于 2004-04-15 14:59 |只看该作者

一个subshell的问题

to r2007:
刚才的帖子有一点小问题,应该是
[jldev@jlstat tmp]$ ( echo $a; env|grep -q ^a= && echo a in env || echo a not in env ; set|grep -q ^a= && echo a in set || echo a not in set )
输出是:
3
a not in env
a  in set

这不仅仅是变量扩展的问题,执行下面的命令
[jldev@jlstat elitesh]$ ( echo $a; env|grep -q ^a= && echo a in env || echo a not in env ; set|grep  ^a=  )
说明在子shell的set中已经有了a=3

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-04-15 16:36 |只看该作者

一个subshell的问题

我想,樓主不妨先確認一下:
* 用 ( comd ) 產生的 nested subshell 跟用 script 所 fork 出來的 subshell ,在環境上是否一致的?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2004-04-15 16:44 |只看该作者

一个subshell的问题

bash打开 -x option,可以看到确实是在fork subshell之前已经进行了变量扩展。
  1. r2007@www r2007 $ a=3
  2. r2007@www r2007 $ (set|grep ^a=)
  3. a=3
复制代码

我查了一下,这在bash书籍中提及过,subshell能看到父进程的变量,但是它所作的任何修改不会影响父进程。这和调用shell脚本的机制不一样。
可以这样设想,(cmdlist)只能是启动一个subshell.
运行脚本就不一样了,在bash提示符下,可以运行其它shell的脚本,当然也可以bash脚本,从程序设计角度考虑,不管运行哪个脚本,其机制应该是一样的,所以就像我们熟知的那样,任何变量需要export才能在运行外部命令和脚本时有效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP