免费注册 查看新帖 |

Chinaunix

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

关于{}与()的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-08 11:42 |只看该作者 |倒序浏览
看了《shell基础67:执行顺序(||及&&,{}及())及正则表表达式》以及《( ) 與 { } 差在哪?》2篇文章中关于()与{}的说明,还是有些疑惑,特来请教大家。
实验如下

脚本testshellpid
  1. #!/bin/bash

  2. echo $
  3. a=1
复制代码



执行命令
  1. $ echo $;( ./testshellpid;echo $a; )

  2. $ echo $;{ ./testshellpid;echo $a; }
复制代码



输出都为
  1. 6469  #当前shell的pid
  2. xxxx   #脚本中的pid,不等于6469
  3. [空]    #$a未定义
复制代码


根据{}与()的说明,我的理解是采用{}来执行上述命令时,脚本中的pid与当前的pid应该是一致的,另外,无论采取哪种方式,$a都不应该未定义,因为"./testshellpid;echo $a"是在同一个shell中执行。

我觉得是我的理解错了,请大家指正。

论坛徽章:
0
2 [报告]
发表于 2010-04-08 12:08 |只看该作者
回复 1# ddvv


  ./xx.sh=sh xx.sh   (fork一个子shell)
. xx.sh=source xx.sh(使用当前shell执行)
exec xx.sh  (使用当前的shell执行,但是执行过后要退出shell)
{}里是当前shell,()是在子shell运行

我觉得是这样,高手给看看有问题么

论坛徽章:
0
3 [报告]
发表于 2010-04-08 12:10 |只看该作者
回复 1# ddvv


    子进程可以继承父进程中的变量,父进程不会继承子进程中变量的。
理解了这句话,$a为空便理所当然了。

论坛徽章:
0
4 [报告]
发表于 2010-04-08 12:18 |只看该作者
回复  ddvv


    子进程可以继承父进程中的变量,父进程不会继承子进程中变量的。
理解了这句话,$a为 ...
levinswong 发表于 2010-04-08 12:10


{ ./testshellpid;echo $a; }

这2个命令不是在同一个shell中的?

论坛徽章:
0
5 [报告]
发表于 2010-04-08 12:52 |只看该作者
没人了?

论坛徽章:
0
6 [报告]
发表于 2010-04-08 12:56 |只看该作者
本帖最后由 levinswong 于 2010-04-08 13:15 编辑
{ ./testshellpid;echo $a; }

这2个命令不是在同一个shell中的?
ddvv 发表于 2010-04-08 12:18


这两个命令是在同一个shell,但执行脚本会产生一个子shell,而脚本中的命令就是在这个子shell中执行的。
这样说会清楚点。

论坛徽章:
0
7 [报告]
发表于 2010-04-08 13:37 |只看该作者
这两个命令是在同一个shell,但执行脚本会产生一个子shell,而脚本中的命令就是在这个子shell中执行的。 ...
levinswong 发表于 2010-04-08 12:56


我也曾经这样理解过,但是还是觉得有些说不通。

如果使用“echo $$;(. ./testshellpid;echo $a; )”的方式来执行(注意前面的'.'),"echo $a"有输出,但是脚本里面的pid与当前的pid是一样的。

()会在一个子shell中执行()中的命令,那么在“echo $$;(. ./testshellpid;echo $a; )”中,()外的“echo $$”与脚本中内的"echo $$"属于2个不同的shell,为什么它们的pid是一样的?

论坛徽章:
0
8 [报告]
发表于 2010-04-08 13:45 |只看该作者
回复 1# ddvv

    (list) list  is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).  Variable assign-
              ments and builtin commands that affect the shell窶冱 environment do not remain in effect after the command
              completes.  The return status is the exit status of list.
       { list; }
              list  is  simply  executed  in the current shell environment.  list must be terminated with a newline or
              semicolon.  This is known as a group command.  The return status is the exit status of list.  Note  that
              unlike  the  metacharacters  ( and ), { and } are reserved words and must occur where a reserved word is
              permitted to be recognized.  Since they do not cause a word break, they must be separated from  list  by
              whitespace.

论坛徽章:
0
9 [报告]
发表于 2010-04-08 13:48 |只看该作者
我也曾经这样理解过,但是还是觉得有些说不通。

如果使用“echo $$;(. ./testshellpid;echo $a; )” ...
ddvv 发表于 2010-04-08 13:37



    ( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
  { }:將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。

论坛徽章:
0
10 [报告]
发表于 2010-04-08 14:01 |只看该作者
回复 7# ddvv

好像对这个问题都没说得很清楚。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP