免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6855 | 回复: 17

用()执行命令组与用脚本执行为什么不同???  关闭 [复制链接]

论坛徽章:
0
发表于 2004-09-06 10:04 |显示全部楼层
shell十三问中曾说(command;command)是由subshell执行的但请看下面的命令:
#a=b
#echo $$
1234
#(echo $a;echo $$)
#a
#1234
若将echo $a与echo $$放在脚本中执行时无法取到变量a的值而且显示的进程号也是subshell的进程号(进程1234的子进程)
()与脚本既然都是由subshell执行为什么执行的结果不一样呢?
对于变量a我并没有执行export为什么用()执行时可以取到变量啊呢?如果是由subshell执行它应该取不到变量a才对,而且echo $$的结果也不应是1234,应是subshell的进程号。

论坛徽章:
0
发表于 2004-09-06 12:04 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

$$是登录shell的PID

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-09-06 13:44 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

我猜猜看, 不一定準:

( cmd ) 稱為 nested subshell , 其 env 與 parrent 是完全一至的...
若用 script, 那是一個 fork, 其 env 來自 parent 的 export 及 initial scripts.

论坛徽章:
0
发表于 2004-09-06 13:52 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???


  1. 您是对的:) 有短话,有兴趣的人可以翻译一下的

  2. A parenthesized command is also executed in a sub-shell without removing non-exported quantities
复制代码

论坛徽章:
0
发表于 2004-09-06 14:48 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

但是(echo $$) 显示的是父shell的id而不是子shell的id,给人的感觉好像是在当前shell中执行的,只不过是复制了一份父shell的环境,执行(sleep 10)后用
ps -ef  观察也未发现subshell的进程。

论坛徽章:
0
发表于 2004-09-06 15:06 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???


  1. type sleep
  2. /usr/bin/sleep

  3. 这样的进程,可以认为是sh exec sleep启动的.
  4. 先启动shell,然后exec sleep. exec 一个文件,
  5. 当前的进程空间就被exec的对象替换,所以你看不到子shell
复制代码

论坛徽章:
0
发表于 2004-09-06 15:36 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

原帖由 "ivhb" 发表:
type sleep
/usr/bin/sleep

这样的进程,可以认为是sh exec sleep启动的.
先启动shell,然后exec sleep. exec 一个文件,
当前的进程空间就被exec的对象替换,所以你看不到子shell



若是如此变量是如何继承的呢?

论坛徽章:
0
发表于 2004-09-06 15:59 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

事实上,昨天我也在考虑这个问题.不过没有想出来
子shell到底怎样继承变量,还不是export出来的变量.呵呵,我摇头了,真的不知道.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-09-06 16:30 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

ivhb 兄不是點出了嗎:
"without removing non-exported quantities"

若 fork 出來的 subsell 被解讀為:
"with removing non-exported quantities"

這樣可理解嗎?

论坛徽章:
0
发表于 2004-09-06 16:45 |显示全部楼层

用()执行命令组与用脚本执行为什么不同???

原帖由 "ivhb" 发表:
事实上,昨天我也在考虑这个问题.不过没有想出来
子shell到底怎样继承变量,还不是export出来的变量.呵呵,我摇头了,真的不知道.

这需要在/etc/profile文件中export一个变量,
做一个实验
$a=aaa  #定义一个局部变量
$export bbb #定义一个全局环境
$echo $a $b
aaa bbb
$ksh  #进入一个子shell
$echo $a $b
bbb   #结果显示,$b被继承下来了,而$a则"不见"了
如果说"子shell到底怎样继承变量",我看也许读一下shell source code,也许那里有答案
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP